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

Artifact 7e5d9a5690e71c39bfc4afea9f351766299dbf2f:


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: 70 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69  pColl && 0==sqli
d830: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
d840: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
d850: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
d860: 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
d870: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
d880: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   -1;.}../*.** Re
d890: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
d8a0: 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73   DISTINCT expres
d8b0: 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64  sion-list passed
d8c0: 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
d8d0: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64  gument.** is red
d8e0: 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20  undant..**.** A 
d8f0: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73  DISTINCT list is
d900: 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20 74 68   redundant if th
d910: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
d920: 69 6e 73 20 73 6f 6d 65 20 73 75 62 73 65 74 20  ins some subset 
d930: 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68  of.** columns th
d940: 61 74 20 61 72 65 20 75 6e 69 71 75 65 20 61 6e  at are unique an
d950: 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73  d non-null..*/.s
d960: 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74  tatic int isDist
d970: 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20  inctRedundant(. 
d980: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
d9a0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d9b0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
d9c0: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
d9d0: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
d9e0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
d9f0: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
da00: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
da10: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
da20: 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20 20   *pDistinct     
da30: 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
da40: 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20 74  set that needs t
da50: 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f  o be DISTINCT */
da60: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
da70: 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
da80: 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  ;.  int i;      
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65      .  int iBase
dab0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
dac0: 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   is more than on
dad0: 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73  e table or sub-s
dae0: 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f  elect in the FRO
daf0: 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a  M clause of.  **
db00: 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65   this query, the
db10: 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  n it will not be
db20: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f   possible to sho
db30: 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49  w that the DISTI
db40: 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65  NCT .  ** clause
db50: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
db60: 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
db70: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
db80: 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20  rn 0;.  iBase = 
db90: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
dba0: 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d  Cursor;.  pTab =
dbb0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
dbc0: 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  pTab;..  /* If a
dbd0: 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ny of the expres
dbe0: 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20  sions is an IPK 
dbf0: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20  column on table 
dc00: 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75  iBase, then retu
dc10: 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e  rn .  ** true. N
dc20: 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61  ote: The (p->iTa
dc30: 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74  ble==iBase) part
dc40: 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d 61   of this test ma
dc50: 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74 68  y be false if th
dc60: 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53  e.  ** current S
dc70: 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72 65  ELECT is a corre
dc80: 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e  lated sub-query.
dc90: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
dca0: 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45   i<pDistinct->nE
dcb0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
dcc0: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
dcd0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
dce0: 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e  pDistinct->a[i].
dcf0: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
dd00: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
dd10: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
dd20: 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  Base && p->iColu
dd30: 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
dd40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  .  }..  /* Loop 
dd50: 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69  through all indi
dd60: 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
dd70: 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20  , checking each 
dd80: 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b  to see if it mak
dd90: 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54  es.  ** the DIST
dda0: 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72  INCT qualifier r
ddb0: 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65  edundant. It doe
ddc0: 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20  s so if:.  **.  
ddd0: 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65  **   1. The inde
dde0: 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51  x is itself UNIQ
ddf0: 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a  UE, and.  **.  *
de00: 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68  *   2. All of th
de10: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
de20: 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65   index are eithe
de30: 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44  r part of the pD
de40: 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20  istinct.  **    
de50: 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20    list, or else 
de60: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
de70: 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d   contains a term
de80: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f   of the form "co
de90: 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20  l=X",.  **      
dea0: 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e  where X is a con
deb0: 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65  stant value. The
dec0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
ded0: 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  nces of the.  **
dee0: 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e        comparison
def0: 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74   and select-list
df00: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
df10: 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66  t match those of
df20: 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a   the index..  **
df30: 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f  .  **   3. All o
df40: 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f  f those index co
df50: 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20  lumns for which 
df60: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
df70: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20   does not.  **  
df80: 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63      contain a "c
df90: 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73  ol=X" term are s
dfa0: 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20  ubject to a NOT 
dfb0: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e  NULL constraint.
dfc0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
dfd0: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
dfe0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
dff0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
e000: 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70  !IsUniqueIndex(p
e010: 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Idx) ) continue;
e020: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
e030: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  pIdx->nKeyCol; i
e040: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 31 36 20 69  ++){.      i16 i
e050: 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  Col = pIdx->aiCo
e060: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69  lumn[i];.      i
e070: 66 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70  f( 0==findTerm(p
e080: 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c  WC, iBase, iCol,
e090: 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f   ~(Bitmask)0, WO
e0a0: 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20  _EQ, pIdx) ){.  
e0b0: 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 43 6f        int iIdxCo
e0c0: 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  l = findIndexCol
e0d0: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
e0e0: 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c  ct, iBase, pIdx,
e0f0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   i);.        if(
e100: 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54   iIdxCol<0 || pT
e110: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e  ab->aCol[iCol].n
e120: 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  otNull==0 ){.   
e130: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e140: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e150: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
e160: 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
e170: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
e180: 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74 68  index implies th
e190: 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  at the DISTINCT 
e1a0: 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65 64  qualifier is red
e1b0: 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  undant. */.     
e1c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
e1d0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30  .  }..  return 0
e1e0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  ;.}.../*.** Esti
e1f0: 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69 74  mate the logarit
e200: 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  hm of the input 
e210: 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32 2e  value to base 2.
e220: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73  .*/.static LogEs
e230: 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74 20  t estLog(LogEst 
e240: 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 4e 3c 3d  N){.  return N<=
e250: 31 30 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33  10 ? 0 : sqlite3
e260: 4c 6f 67 45 73 74 28 4e 29 20 2d 20 33 33 3b 0a  LogEst(N) - 33;.
e270: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75  }../*.** Two rou
e280: 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69  tines for printi
e290: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
e2a0: 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  f an sqlite3_ind
e2b0: 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ex_info.** struc
e2c0: 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20  ture.  Used for 
e2d0: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
e2e0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20  gging only.  If 
e2f0: 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54  neither.** SQLIT
e300: 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45  E_TEST or SQLITE
e310: 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e  _DEBUG are defin
e320: 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72  ed, then these r
e330: 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e  outines.** are n
e340: 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64  o-ops..*/.#if !d
e350: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
e360: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
e370: 20 26 26 20 64 65 66 69 6e 65 64 28 57 48 45 52   && defined(WHER
e380: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a  ETRACE_ENABLED).
e390: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
e3a0: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c  E_IDX_INPUTS(sql
e3b0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
e3c0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
e3d0: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
e3e0: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
e3f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
e400: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
e410: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
e420: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f  ebugPrintf("  co
e430: 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f  nstraint[%d]: co
e440: 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f  l=%d termid=%d o
e450: 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c  p=%d usabled=%d\
e460: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
e470: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
e480: 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a  int[i].iColumn,.
e490: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
e4a0: 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66  raint[i].iTermOf
e4b0: 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e  fset,.       p->
e4c0: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f  aConstraint[i].o
e4d0: 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  p,.       p->aCo
e4e0: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
e4f0: 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  le);.  }.  for(i
e500: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42  =0; i<p->nOrderB
e510: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  y; i++){.    sql
e520: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e530: 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20  "  orderby[%d]: 
e540: 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e  col=%d desc=%d\n
e550: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
e560: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
e570: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
e580: 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
e590: 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73  ].desc);.  }.}.s
e5a0: 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
e5b0: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c  _IDX_OUTPUTS(sql
e5c0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
e5d0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
e5e0: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
e5f0: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
e600: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
e610: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
e620: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
e630: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73  ebugPrintf("  us
e640: 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78  age[%d]: argvIdx
e650: 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a  =%d omit=%d\n",.
e660: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
e670: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
e680: 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
e690: 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  x,.       p->aCo
e6a0: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
e6b0: 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71  .omit);.  }.  sq
e6c0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
e6d0: 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22  ("  idxNum=%d\n"
e6e0: 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20  , p->idxNum);.  
e6f0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
e700: 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c  tf("  idxStr=%s\
e710: 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a  n", p->idxStr);.
e720: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
e730: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43  intf("  orderByC
e740: 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70  onsumed=%d\n", p
e750: 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
e760: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  d);.  sqlite3Deb
e770: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
e780: 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c  matedCost=%g\n",
e790: 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73   p->estimatedCos
e7a0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  t);.  sqlite3Deb
e7b0: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
e7c0: 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e  matedRows=%lld\n
e7d0: 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 52  ", p->estimatedR
e7e0: 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ows);.}.#else.#d
e7f0: 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
e800: 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e  INPUTS(A).#defin
e810: 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  e TRACE_IDX_OUTP
e820: 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23  UTS(A).#endif..#
e830: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e840: 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
e850: 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  EX./*.** Return 
e860: 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45 52  TRUE if the WHER
e870: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 54  E clause term pT
e880: 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72 6d  erm is of a form
e890: 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75   where it.** cou
e8a0: 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ld be used with 
e8b0: 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63 65  an index to acce
e8c0: 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69 6e  ss pSrc, assumin
e8d0: 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  g an appropriate
e8e0: 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74 65  .** index existe
e8f0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
e900: 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
e910: 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ex(.  WhereTerm 
e920: 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *pTerm,         
e930: 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c       /* WHERE cl
e940: 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68 65  ause term to che
e950: 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ck */.  struct S
e960: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
e970: 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  c,     /* Table 
e980: 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
e990: 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69 74   access */.  Bit
e9a0: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20  mask notReady   
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e9c0: 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20 6c  ables in outer l
e9d0: 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e  oops of the join
e9e0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 66   */.){.  char af
e9f0: 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  f;.  if( pTerm->
ea00: 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72 63  leftCursor!=pSrc
ea10: 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74 75  ->iCursor ) retu
ea20: 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65  rn 0;.  if( (pTe
ea30: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
ea40: 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65 74 75  WO_EQ)==0 ) retu
ea50: 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65  rn 0;.  if( (pTe
ea60: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
ea70: 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
ea80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
ea90: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
eaa0: 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20  lumn<0 ) return 
eab0: 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d  0;.  aff = pSrc-
eac0: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72  >pTab->aCol[pTer
ead0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d  m->u.leftColumn]
eae0: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28  .affinity;.  if(
eaf0: 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66   !sqlite3IndexAf
eb00: 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e  finityOk(pTerm->
eb10: 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65  pExpr, aff) ) re
eb20: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
eb30: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23   1;.}.#endif...#
eb40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
eb50: 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
eb60: 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  EX./*.** Generat
eb70: 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72  e code to constr
eb80: 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62  uct the Index ob
eb90: 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f  ject for an auto
eba0: 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61  matic index.** a
ebb0: 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65  nd to set up the
ebc0: 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65   WhereLevel obje
ebd0: 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61  ct pLevel so tha
ebe0: 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
ebf0: 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73  ator.** makes us
ec00: 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74  e of the automat
ec10: 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ic index..*/.sta
ec20: 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75  tic void constru
ec30: 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
ec40: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
ec50: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
ec60: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
ec70: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
ec80: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
ec90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
eca0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
ecb0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
ecc0: 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
ecd0: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
ece0: 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20  term to get the 
ecf0: 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  next index */.  
ed00: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
ed10: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
ed20: 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ask of cursors t
ed30: 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69  hat are not avai
ed40: 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  lable */.  Where
ed50: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20  Level *pLevel   
ed60: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
ed70: 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a  new index here *
ed80: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65 79 43  /.){.  int nKeyC
ed90: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
eda0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
edb0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
edc0: 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78  onstructed index
edd0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
ede0: 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
edf0: 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
ee00: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
ee10: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
ee20: 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20  eTerm *pWCEnd;  
ee30: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
ee40: 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  f pWC->a[] */.  
ee50: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
ee70: 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67  bject describing
ee80: 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69   the transient i
ee90: 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ndex */.  Vdbe *
eea0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
eeb0: 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65        /* Prepare
eec0: 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
eed0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
eee0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74  /.  int addrInit
eef0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ef00: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
ef10: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
ef20: 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a   bypass jump */.
ef30: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ef50: 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
ef60: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
ef70: 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
ef80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
ef90: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 66 69   of the index fi
efa0: 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  ll loop */.  int
efb0: 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20   regRecord;     
efc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
efd0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e 20  ster holding an 
efe0: 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
eff0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f010: 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72 20   Column counter 
f020: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f040: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
f050: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74 43   */.  int mxBitC
f060: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
f070: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 6c    /* Maximum col
f080: 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f 6c  umn in pSrc->col
f090: 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65  Used */.  CollSe
f0a0: 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
f0b0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
f0c0: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 6f  ng sequence to o
f0d0: 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  n a column */.  
f0e0: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
f0f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
f100: 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  he Loop object *
f110: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55 73  /.  char *zNotUs
f120: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
f130: 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 6f  /* Extra space o
f140: 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 70 49 64  n the end of pId
f150: 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  x */.  Bitmask i
f160: 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20  dxCols;         
f170: 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
f180: 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72  columns used for
f190: 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42   indexing */.  B
f1a0: 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73  itmask extraCols
f1b0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69  ;          /* Bi
f1c0: 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e  tmap of addition
f1d0: 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  al columns */.  
f1e0: 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d  u8 sentWarning =
f1f0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
f200: 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69 6e  rue if a warnnin
f210: 67 20 68 61 73 20 62 65 65 6e 20 69 73 73 75 65  g has been issue
f220: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 61  d */.  Expr *pPa
f230: 72 74 69 61 6c 20 3d 20 30 3b 20 20 20 20 20 20  rtial = 0;      
f240: 20 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 49 6e     /* Partial In
f250: 64 65 78 20 45 78 70 72 65 73 73 69 6f 6e 20 2a  dex Expression *
f260: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
f270: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
f280: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
f290: 73 6b 69 70 20 65 78 63 6c 75 64 65 64 20 72 6f  skip excluded ro
f2a0: 77 73 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  ws */..  /* Gene
f2b0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
f2c0: 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
f2d0: 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
f2e0: 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
f2f0: 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
f300: 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
f310: 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
f320: 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
f330: 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
f340: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
f350: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64  t( v!=0 );.  add
f360: 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43  rInit = sqlite3C
f370: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
f380: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f390: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
f3a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
f3b0: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
f3c0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
f3d0: 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65  dex.  ** and use
f3e0: 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45  d to match WHERE
f3f0: 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
f400: 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c  nts */.  nKeyCol
f410: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d   = 0;.  pTable =
f420: 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70   pSrc->pTab;.  p
f430: 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b  WCEnd = &pWC->a[
f440: 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70  pWC->nTerm];.  p
f450: 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
f460: 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73  WLoop;.  idxCols
f470: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
f480: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
f490: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
f4a0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
f4b0: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
f4c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
f4d0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
f4e0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
f4f0: 6e 29 20 20 20 20 2f 2a 20 70 72 65 72 65 71 20  n)    /* prereq 
f500: 61 6c 77 61 79 73 20 6e 6f 6e 2d 7a 65 72 6f 20  always non-zero 
f510: 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  */.         || p
f520: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
f530: 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75  Table!=pSrc->iCu
f540: 72 73 6f 72 20 20 20 2f 2a 20 20 20 66 6f 72 20  rsor   /*   for 
f550: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 20  the right-hand  
f560: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20   */.         || 
f570: 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 21 3d 30  pLoop->prereq!=0
f580: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
f590: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 74 61 62          /*   tab
f5a0: 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  le of a LEFT JOI
f5b0: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f  N */.    if( pLo
f5c0: 6f 70 2d 3e 70 72 65 72 65 71 3d 3d 30 0a 20 20  op->prereq==0.  
f5d0: 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74     && (pTerm->wt
f5e0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
f5f0: 54 55 41 4c 29 3d 3d 30 0a 20 20 20 20 20 26 26  TUAL)==0.     &&
f600: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
f610: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
f620: 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 73 71  Join).     && sq
f630: 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65  lite3ExprIsTable
f640: 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 2c 20  Constant(pExpr, 
f650: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 20 29  pSrc->iCursor) )
f660: 7b 0a 20 20 20 20 20 20 70 50 61 72 74 69 61 6c  {.      pPartial
f670: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
f680: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50  d(pParse->db, pP
f690: 61 72 74 69 61 6c 2c 0a 20 20 20 20 20 20 20 20  artial,.        
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 73 71 6c 69 74 65 33 45          sqlite3E
f6c0: 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
f6d0: 62 2c 20 70 45 78 70 72 2c 20 30 29 29 3b 0a 20  b, pExpr, 0));. 
f6e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 72     }.    if( ter
f6f0: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
f700: 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
f710: 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
f720: 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
f730: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
f740: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
f750: 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
f760: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
f770: 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b  : MASKBIT(iCol);
f780: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f790: 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20   iCol==BMS );.  
f7a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
f7b0: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
f7c0: 20 20 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e     if( !sentWarn
f7d0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
f7e0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
f7f0: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
f800: 44 45 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20  DEX,.           
f810: 20 22 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65   "automatic inde
f820: 78 20 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54  x on %s(%s)", pT
f830: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  able->zName,.   
f840: 20 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d           pTable-
f850: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
f860: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74  e);.        sent
f870: 57 61 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20  Warning = 1;.   
f880: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
f890: 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
f8a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
f8b0: 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
f8c0: 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ze(pParse->db, p
f8d0: 4c 6f 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29  Loop, nKeyCol+1)
f8e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
f8f0: 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65  to end_auto_inde
f900: 78 5f 63 72 65 61 74 65 3b 0a 20 20 20 20 20 20  x_create;.      
f910: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f    }.        pLoo
f920: 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f  p->aLTerm[nKeyCo
f930: 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  l++] = pTerm;.  
f940: 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d        idxCols |=
f950: 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a   cMask;.      }.
f960: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
f970: 72 74 28 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b  rt( nKeyCol>0 );
f980: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
f990: 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  e.nEq = pLoop->n
f9a0: 4c 54 65 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b  LTerm = nKeyCol;
f9b0: 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  .  pLoop->wsFlag
f9c0: 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
f9d0: 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f  _EQ | WHERE_IDX_
f9e0: 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44  ONLY | WHERE_IND
f9f0: 45 58 45 44 0a 20 20 20 20 20 20 20 20 20 20 20  EXED.           
fa00: 20 20 20 20 20 20 20 20 20 20 7c 20 57 48 45 52            | WHER
fa10: 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20  E_AUTO_INDEX;.. 
fa20: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
fa30: 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e  mber of addition
fa40: 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
fa50: 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20  d to create a.  
fa60: 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  ** covering inde
fa70: 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20  x.  A "covering 
fa80: 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64  index" is an ind
fa90: 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
faa0: 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   all.  ** column
fab0: 73 20 74 68 61 74 20 61 72 65 20 6e 65 65 64 65  s that are neede
fac0: 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 20  d by the query. 
fad0: 20 57 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67   With a covering
fae0: 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a   index, the.  **
faf0: 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
fb00: 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
fb10: 65 20 61 63 63 65 73 73 65 64 2e 20 20 41 75 74  e accessed.  Aut
fb20: 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d  omatic indices m
fb30: 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f  ust.  ** be a co
fb40: 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63  vering index bec
fb50: 61 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 77  ause the index w
fb60: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
fb70: 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f  ed if the.  ** o
fb80: 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68  riginal table ch
fb90: 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e  anges and the in
fba0: 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61  dex and table ca
fbb0: 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65  nnot both be use
fbc0: 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67  d.  ** if they g
fbd0: 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20  o out of sync.. 
fbe0: 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20   */.  extraCols 
fbf0: 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  = pSrc->colUsed 
fc00: 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41  & (~idxCols | MA
fc10: 53 4b 42 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20  SKBIT(BMS-1));. 
fc20: 20 6d 78 42 69 74 43 6f 6c 20 3d 20 4d 49 4e 28   mxBitCol = MIN(
fc30: 42 4d 53 2d 31 2c 70 54 61 62 6c 65 2d 3e 6e 43  BMS-1,pTable->nC
fc40: 6f 6c 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ol);.  testcase(
fc50: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42   pTable->nCol==B
fc60: 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61  MS-1 );.  testca
fc70: 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  se( pTable->nCol
fc80: 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72  ==BMS-2 );.  for
fc90: 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
fca0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
fcb0: 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b  extraCols & MASK
fcc0: 42 49 54 28 69 29 20 29 20 6e 4b 65 79 43 6f 6c  BIT(i) ) nKeyCol
fcd0: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ++;.  }.  if( pS
fce0: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41  rc->colUsed & MA
fcf0: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a  SKBIT(BMS-1) ){.
fd00: 20 20 20 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70      nKeyCol += p
fd10: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d  Table->nCol - BM
fd20: 53 20 2b 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  S + 1;.  }..  /*
fd30: 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   Construct the I
fd40: 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64  ndex object to d
fd50: 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64  escribe this ind
fd60: 65 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73  ex */.  pIdx = s
fd70: 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e  qlite3AllocateIn
fd80: 64 65 78 4f 62 6a 65 63 74 28 70 50 61 72 73 65  dexObject(pParse
fd90: 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c  ->db, nKeyCol+1,
fda0: 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a   0, &zNotUsed);.
fdb0: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20    if( pIdx==0 ) 
fdc0: 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e  goto end_auto_in
fdd0: 64 65 78 5f 63 72 65 61 74 65 3b 0a 20 20 70 4c  dex_create;.  pL
fde0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
fdf0: 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49  dex = pIdx;.  pI
fe00: 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74  dx->zName = "aut
fe10: 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78  o-index";.  pIdx
fe20: 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  ->pTable = pTabl
fe30: 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64  e;.  n = 0;.  id
fe40: 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72  xCols = 0;.  for
fe50: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
fe60: 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
fe70: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74  rm++){.    if( t
fe80: 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
fe90: 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f  (pTerm, pSrc, no
fea0: 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20  tReady) ){.     
feb0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72   int iCol = pTer
fec0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
fed0: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63  .      Bitmask c
fee0: 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53  Mask = iCol>=BMS
fef0: 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   ? MASKBIT(BMS-1
ff00: 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c  ) : MASKBIT(iCol
ff10: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
ff20: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
ff30: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
ff40: 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ( iCol==BMS );. 
ff50: 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c       if( (idxCol
ff60: 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b  s & cMask)==0 ){
ff70: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
ff80: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
ff90: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
ffa0: 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
ffb0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
ffc0: 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75  mn[n] = pTerm->u
ffd0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
ffe0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
fff0: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
10000 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
10010 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
10020 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
10030 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
10040 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
10050 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52  ->zName : "BINAR
10060 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b  Y";.        n++;
10070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10080 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75 33   }.  assert( (u3
10090 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  2)n==pLoop->u.bt
100a0 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a  ree.nEq );..  /*
100b0 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20   Add additional 
100c0 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74  columns needed t
100d0 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d  o make the autom
100e0 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a  atic index into.
100f0 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20    ** a covering 
10100 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69  index */.  for(i
10110 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
10120 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
10130 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49  traCols & MASKBI
10140 54 28 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49  T(i) ){.      pI
10150 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
10160 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  = i;.      pIdx-
10170 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49  >azColl[n] = "BI
10180 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b  NARY";.      n++
10190 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
101a0 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
101b0 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  & MASKBIT(BMS-1)
101c0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d   ){.    for(i=BM
101d0 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  S-1; i<pTable->n
101e0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
101f0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
10200 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
10210 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
10220 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
10230 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
10240 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79   assert( n==nKey
10250 43 6f 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61  Col );.  pIdx->a
10260 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b  iColumn[n] = -1;
10270 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  .  pIdx->azColl[
10280 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 0a  n] = "BINARY";..
10290 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
102a0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
102b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  */.  assert( pLe
102c0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20  vel->iIdxCur>=0 
102d0 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64  );.  pLevel->iId
102e0 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xCur = pParse->n
102f0 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  Tab++;.  sqlite3
10300 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10310 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20  _OpenAutoindex, 
10320 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
10330 20 6e 4b 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73   nKeyCol+1);.  s
10340 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
10350 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
10360 49 64 78 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  Idx);.  VdbeComm
10370 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22  ent((v, "for %s"
10380 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
10390 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68  );..  /* Fill th
103a0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
103b0 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a  x with content *
103c0 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
103d0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
103e0 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  ;.  addrTop = sq
103f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
10400 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c  v, OP_Rewind, pL
10410 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 20  evel->iTabCur); 
10420 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10430 0a 20 20 69 66 28 20 70 50 61 72 74 69 61 6c 20  .  if( pPartial 
10440 29 7b 0a 20 20 20 20 69 43 6f 6e 74 69 6e 75 65  ){.    iContinue
10450 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
10460 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
10470 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
10480 73 65 28 70 50 61 72 73 65 2c 20 70 50 61 72 74  se(pParse, pPart
10490 69 61 6c 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  ial, iContinue, 
104a0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
104b0 4c 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77  L);.    pLoop->w
104c0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
104d0 50 41 52 54 49 41 4c 49 44 58 3b 0a 20 20 7d 0a  PARTIALIDX;.  }.
104e0 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
104f0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
10500 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
10510 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
10520 65 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c  ey(pParse, pIdx,
10530 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
10540 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30 2c 20  , regRecord, 0, 
10550 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  0, 0, 0);.  sqli
10560 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10570 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
10580 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
10590 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
105a0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
105b0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
105c0 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 69 66  EEKRESULT);.  if
105d0 28 20 70 50 61 72 74 69 61 6c 20 29 20 73 71 6c  ( pPartial ) sql
105e0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
105f0 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75  abel(v, iContinu
10600 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
10610 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
10620 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  xt, pLevel->iTab
10630 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Cur, addrTop+1);
10640 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
10650 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
10660 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
10670 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
10680 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74  OINDEX);.  sqlit
10690 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
106a0 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
106b0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
106c0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
106d0 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
106e0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
106f0 61 72 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  arse);.  .  /* J
10700 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
10710 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
10720 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
10730 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10740 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
10750 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78  ..end_auto_index
10760 5f 63 72 65 61 74 65 3a 0a 20 20 73 71 6c 69 74  _create:.  sqlit
10770 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
10780 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61  rse->db, pPartia
10790 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  l);.}.#endif /* 
107a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
107b0 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
107c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
107d0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
107e0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
107f0 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
10800 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
10810 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  fo structure. It
10820 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
10830 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
10840 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
10850 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
10860 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  he structure.** 
10870 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70  by passing the p
10880 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
10890 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
108a0 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
108b0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ()..*/.static sq
108c0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
108d0 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49   *allocateIndexI
108e0 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nfo(.  Parse *pP
108f0 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c 61  arse,.  WhereCla
10900 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72 75  use *pWC,.  stru
10910 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
10920 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73  *pSrc,.  ExprLis
10930 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20  t *pOrderBy.){. 
10940 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
10950 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74   nTerm;.  struct
10960 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
10970 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
10980 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
10990 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
109a0 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79  rby *pIdxOrderBy
109b0 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
109c0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
109d0 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
109e0 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  e;.  WhereTerm *
109f0 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72  pTerm;.  int nOr
10a00 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33  derBy;.  sqlite3
10a10 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
10a20 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75  xInfo;..  /* Cou
10a30 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
10a40 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20   possible WHERE 
10a50 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
10a60 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a  ts referring.  *
10a70 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  * to this virtua
10a80 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72  l table */.  for
10a90 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72  (i=nTerm=0, pTer
10aa0 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
10ab0 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
10ac0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  rm++){.    if( p
10ad0 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
10ae0 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f   != pSrc->iCurso
10af0 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
10b00 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
10b10 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
10b20 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
10b30 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
10b40 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
10b50 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
10b60 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
10b70 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
10b80 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
10b90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
10ba0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
10bb0 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69   WO_ALL );.    i
10bc0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
10bd0 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55  ator & ~(WO_ISNU
10be0 4c 4c 7c 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30  LL|WO_EQUIV))==0
10bf0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
10c00 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
10c10 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
10c20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
10c30 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20   nTerm++;.  }.. 
10c40 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
10c50 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   BY clause conta
10c60 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73  ins only columns
10c70 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
10c80 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
10c90 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ble then allocat
10ca0 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
10cb0 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66  aOrderBy part of
10cc0 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
10cd0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
10ce0 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e  ucture..  */.  n
10cf0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69  OrderBy = 0;.  i
10d00 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
10d10 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65     int n = pOrde
10d20 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
10d30 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
10d40 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
10d50 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
10d60 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
10d70 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
10d80 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
10d90 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
10da0 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62  Src->iCursor ) b
10db0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
10dc0 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20  if( i==n){.     
10dd0 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20   nOrderBy = n;. 
10de0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
10df0 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
10e00 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
10e10 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20  tructure.  */.  
10e20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pIdxInfo = sqlit
10e30 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
10e40 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
10e50 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20  f(*pIdxInfo).   
10e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e70 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f          + (sizeo
10e80 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73  f(*pIdxCons) + s
10e90 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a  izeof(*pUsage))*
10ea0 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20  nTerm.          
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ec0 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f   + sizeof(*pIdxO
10ed0 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79  rderBy)*nOrderBy
10ee0 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e   );.  if( pIdxIn
10ef0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  fo==0 ){.    sql
10f00 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
10f10 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  rse, "out of mem
10f20 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ory");.    retur
10f30 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
10f40 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74  nitialize the st
10f50 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71  ructure.  The sq
10f60 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
10f70 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
10f80 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69  ins.  ** many fi
10f90 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65  elds that are de
10fa0 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74  clared "const" t
10fb0 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49  o prevent xBestI
10fc0 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ndex from.  ** c
10fd0 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57  hanging them.  W
10fe0 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d  e have to do som
10ff0 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20  e funky casting 
11000 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  in order to.  **
11010 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73   initialize thos
11020 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20  e fields..  */. 
11030 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72   pIdxCons = (str
11040 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
11050 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70  x_constraint*)&p
11060 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49  IdxInfo[1];.  pI
11070 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72  dxOrderBy = (str
11080 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
11090 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78  x_orderby*)&pIdx
110a0 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70  Cons[nTerm];.  p
110b0 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20  Usage = (struct 
110c0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
110d0 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29  nstraint_usage*)
110e0 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72  &pIdxOrderBy[nOr
110f0 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a  derBy];.  *(int*
11100 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )&pIdxInfo->nCon
11110 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b  straint = nTerm;
11120 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
11130 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
11140 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  nOrderBy;.  *(st
11150 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
11160 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
11170 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
11180 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e  traint = pIdxCon
11190 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  s;.  *(struct sq
111a0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
111b0 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  rby**)&pIdxInfo-
111c0 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78  >aOrderBy = pIdx
111d0 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
111e0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
111f0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
11200 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  ge**)&pIdxInfo->
11210 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
11220 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
11230 20 20 20 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 70 55 73 61 67 65 3b 0a 0a 20        pUsage;.. 
11270 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
11280 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
11290 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
112a0 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70  rm++){.    u8 op
112b0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
112c0 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
112d0 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
112e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
112f0 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
11300 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
11310 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
11320 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
11330 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
11340 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
11350 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
11360 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
11370 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
11380 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
11390 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
113a0 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  LL );.    if( (p
113b0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
113c0 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  & ~(WO_ISNULL|WO
113d0 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63 6f  _EQUIV))==0 ) co
113e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
113f0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
11400 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
11410 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78  ntinue;.    pIdx
11420 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
11430 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
11440 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
11450 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
11460 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d  et = i;.    op =
11470 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
11480 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
11490 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
114a0 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
114b0 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
114c0 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20  op = op;.    /* 
114d0 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67  The direct assig
114e0 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65  nment in the pre
114f0 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f  vious line is po
11500 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61  ssible only beca
11510 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57  use.    ** the W
11520 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e  O_ and SQLITE_IN
11530 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20  DEX_CONSTRAINT_ 
11540 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69  codes are identi
11550 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  cal.  The.    **
11560 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
11570 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66  ts verify this f
11580 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  act. */.    asse
11590 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54  rt( WO_EQ==SQLIT
115a0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
115b0 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73  NT_EQ );.    ass
115c0 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49  ert( WO_LT==SQLI
115d0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
115e0 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73  INT_LT );.    as
115f0 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c  sert( WO_LE==SQL
11600 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
11610 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61  AINT_LE );.    a
11620 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
11630 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
11640 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
11650 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
11660 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
11670 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
11680 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43   assert( WO_MATC
11690 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  H==SQLITE_INDEX_
116a0 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
116b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
116c0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
116d0 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c   & (WO_IN|WO_EQ|
116e0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
116f0 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48  T|WO_GE|WO_MATCH
11700 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  ) );.    j++;.  
11710 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
11720 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
11730 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
11740 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
11750 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f  pExpr;.    pIdxO
11760 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
11770 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
11780 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  mn;.    pIdxOrde
11790 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f  rBy[i].desc = pO
117a0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
117b0 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  tOrder;.  }..  r
117c0 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a  eturn pIdxInfo;.
117d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62  }../*.** The tab
117e0 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65  le object refere
117f0 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68  nce passed as th
11800 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
11810 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
11820 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65  on.** must repre
11830 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74  sent a virtual t
11840 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
11850 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ion invokes the 
11860 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20  xBestIndex().** 
11870 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
11880 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68  rtual table with
11890 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
118a0 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74  ex_info object t
118b0 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20  hat.** comes in 
118c0 61 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d  as the 3rd argum
118d0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
118e0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
118f0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
11900 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61  pParse is popula
11910 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
11920 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a  r message and a.
11930 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
11940 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
11950 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
11960 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
11970 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f  output.** part o
11980 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
11990 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
119a0 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c  re is left popul
119b0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ated..**.** Whet
119c0 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72  her or not an er
119d0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ror is returned,
119e0 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
119f0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
11a00 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
11a10 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d  entually free p-
11a20 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65  >idxStr if p->ne
11a30 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69  edToFreeIdxStr i
11a40 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74  ndicates.** that
11a50 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65   this is require
11a60 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
11a70 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50   vtabBestIndex(P
11a80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
11a90 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74  ble *pTab, sqlit
11aa0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
11ab0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  ){.  sqlite3_vta
11ac0 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74  b *pVtab = sqlit
11ad0 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72  e3GetVTable(pPar
11ae0 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70  se->db, pTab)->p
11af0 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vtab;.  int i;. 
11b00 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43   int rc;..  TRAC
11b10 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b  E_IDX_INPUTS(p);
11b20 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70  .  rc = pVtab->p
11b30 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64  Module->xBestInd
11b40 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20  ex(pVtab, p);.  
11b50 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
11b60 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  S(p);..  if( rc!
11b70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11b80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11b90 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
11ba0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
11bb0 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
11bc0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74    }else if( !pVt
11bd0 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ab->zErrMsg ){. 
11be0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
11bf0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
11c00 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
11c10 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (rc));.    }else
11c20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11c30 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11c40 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72  "%s", pVtab->zEr
11c50 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rMsg);.    }.  }
11c60 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
11c70 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
11c80 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
11c90 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  g = 0;..  for(i=
11ca0 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
11cb0 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  int; i++){.    i
11cc0 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69  f( !p->aConstrai
11cd0 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20  nt[i].usable && 
11ce0 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
11cf0 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
11d00 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
11d10 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11d20 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
11d30 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49  table %s: xBestI
11d40 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e  ndex returned an
11d50 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20   invalid plan", 
11d60 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
11d70 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
11d80 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a  n pParse->nErr;.
11d90 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
11da0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
11db0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a  _VIRTUALTABLE) *
11dc0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
11dd0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
11de0 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT4./*.** Est
11df0 69 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69  imate the locati
11e00 6f 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c  on of a particul
11e10 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c  ar key among all
11e20 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69   keys in an.** i
11e30 6e 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65  ndex.  Store the
11e40 20 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61   results in aSta
11e50 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  t as follows:.**
11e60 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20  .**    aStat[0] 
11e70 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72       Est. number
11e80 20 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68   of rows less th
11e90 61 6e 20 70 52 65 63 0a 2a 2a 20 20 20 20 61 53  an pRec.**    aS
11ea0 74 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e  tat[1]      Est.
11eb0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
11ec0 65 71 75 61 6c 20 74 6f 20 70 52 65 63 0a 2a 2a  equal to pRec.**
11ed0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
11ee0 6e 64 65 78 20 6f 66 20 74 68 65 20 73 61 6d 70  ndex of the samp
11ef0 6c 65 20 74 68 61 74 20 69 73 20 74 68 65 20 73  le that is the s
11f00 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 74  mallest sample t
11f10 68 61 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  hat.** is greate
11f20 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
11f30 74 6f 20 70 52 65 63 2e 20 4e 6f 74 65 20 74 68  to pRec. Note th
11f40 61 74 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  at this index is
11f50 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78 0a 2a 2a   not an index.**
11f60 20 69 6e 74 6f 20 74 68 65 20 61 53 61 6d 70 6c   into the aSampl
11f70 65 5b 5d 20 61 72 72 61 79 20 2d 20 69 74 20 69  e[] array - it i
11f80 73 20 61 6e 20 69 6e 64 65 78 20 69 6e 74 6f 20  s an index into 
11f90 61 20 76 69 72 74 75 61 6c 20 73 65 74 20 6f 66  a virtual set of
11fa0 20 73 61 6d 70 6c 65 73 0a 2a 2a 20 62 61 73 65   samples.** base
11fb0 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d on the content
11fc0 73 20 6f 66 20 61 53 61 6d 70 6c 65 5b 5d 20 61  s of aSample[] a
11fd0 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
11fe0 20 66 69 65 6c 64 73 20 69 6e 20 72 65 63 6f 72   fields in recor
11ff0 64 20 0a 2a 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a  d .** pRec. .*/.
12000 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
12010 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61 72 73  KeyStats(.  Pars
12020 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
12030 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
12040 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
12050 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
12060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12070 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73  /* Index to cons
12080 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a  ider domain of *
12090 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
120a0 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20  rd *pRec,       
120b0 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c  /* Vector of val
120c0 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  ues to consider 
120d0 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70  */.  int roundUp
120e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
120f0 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20   /* Round up if 
12100 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77  true.  Round dow
12110 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20  n if false */.  
12120 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20  tRowcnt *aStat  
12130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
12140 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74 65  UT: stats writte
12150 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  n here */.){.  I
12160 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d  ndexSample *aSam
12170 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d  ple = pIdx->aSam
12180 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  ple;.  int iCol;
12190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121a0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
121b0 65 71 75 69 72 65 64 20 73 74 61 74 73 20 69 6e  equired stats in
121c0 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a   anEq[] etc. */.
121d0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
121f0 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
12200 73 61 6d 70 6c 65 20 3e 3d 20 70 52 65 63 20 2a  sample >= pRec *
12210 2f 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 3b  /.  int iSample;
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12230 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70  /* Smallest samp
12240 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f  le larger than o
12250 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20  r equal to pRec 
12260 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20  */.  int iMin = 
12270 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12280 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d   /* Smallest sam
12290 70 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74  ple not yet test
122a0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73  ed */.  int iTes
122b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
122c0 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70      /* Next samp
122d0 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20  le to test */.  
122e0 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
122f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12300 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
12310 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  son operation */
12320 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20  .  int nField;  
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12340 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  * Number of fiel
12350 64 73 20 69 6e 20 70 52 65 63 20 2a 2f 0a 20 20  ds in pRec */.  
12360 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d  tRowcnt iLower =
12370 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 61   0;         /* a
12380 6e 4c 74 5b 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f  nLt[] + anEq[] o
12390 66 20 6c 61 72 67 65 73 74 20 73 61 6d 70 6c 65  f largest sample
123a0 20 70 52 65 63 20 69 73 20 3e 20 2a 2f 0a 0a 23   pRec is > */..#
123b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
123c0 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  BUG.  UNUSED_PAR
123d0 41 4d 45 54 45 52 28 20 70 50 61 72 73 65 20 29  AMETER( pParse )
123e0 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
123f0 74 28 20 70 52 65 63 21 3d 30 20 29 3b 0a 20 20  t( pRec!=0 );.  
12400 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53  assert( pIdx->nS
12410 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73  ample>0 );.  ass
12420 65 72 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c  ert( pRec->nFiel
12430 64 3e 30 20 26 26 20 70 52 65 63 2d 3e 6e 46 69  d>0 && pRec->nFi
12440 65 6c 64 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  eld<=pIdx->nSamp
12450 6c 65 43 6f 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44  leCol );..  /* D
12460 6f 20 61 20 62 69 6e 61 72 79 20 73 65 61 72 63  o a binary searc
12470 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20 66 69  h to find the fi
12480 72 73 74 20 73 61 6d 70 6c 65 20 67 72 65 61 74  rst sample great
12490 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
124a0 0a 20 20 2a 2a 20 74 6f 20 70 52 65 63 2e 20 49  .  ** to pRec. I
124b0 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e 73 20  f pRec contains 
124c0 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 2c 20  a single field, 
124d0 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c  the set of sampl
124e0 65 73 20 74 6f 20 73 65 61 72 63 68 0a 20 20 2a  es to search.  *
124f0 2a 20 69 73 20 73 69 6d 70 6c 79 20 74 68 65 20  * is simply the 
12500 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e  aSample[] array.
12510 20 49 66 20 74 68 65 20 73 61 6d 70 6c 65 73 20   If the samples 
12520 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e  in aSample[] con
12530 74 61 69 6e 20 6d 6f 72 65 0a 20 20 2a 2a 20 74  tain more.  ** t
12540 68 61 6e 20 6f 6e 65 20 66 69 65 6c 64 73 2c 20  han one fields, 
12550 61 6c 6c 20 66 69 65 6c 64 73 20 66 6f 6c 6c 6f  all fields follo
12560 77 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 61  wing the first a
12570 72 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a  re ignored..  **
12580 0a 20 20 2a 2a 20 49 66 20 70 52 65 63 20 63 6f  .  ** If pRec co
12590 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c  ntains N fields,
125a0 20 77 68 65 72 65 20 4e 20 69 73 20 6d 6f 72 65   where N is more
125b0 20 74 68 61 6e 20 6f 6e 65 2c 20 74 68 65 6e 20   than one, then 
125c0 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 0a 20  as well as the. 
125d0 20 2a 2a 20 73 61 6d 70 6c 65 73 20 69 6e 20 61   ** samples in a
125e0 53 61 6d 70 6c 65 5b 5d 20 28 74 72 75 6e 63 61  Sample[] (trunca
125f0 74 65 64 20 74 6f 20 4e 20 66 69 65 6c 64 73 29  ted to N fields)
12600 2c 20 74 68 65 20 73 65 61 72 63 68 20 61 6c 73  , the search als
12610 6f 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 63 6f  o has to.  ** co
12620 6e 73 69 64 65 72 20 70 72 65 66 69 78 65 73 20  nsider prefixes 
12630 6f 66 20 74 68 6f 73 65 20 73 61 6d 70 6c 65 73  of those samples
12640 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
12650 66 20 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d  f the set of sam
12660 70 6c 65 73 0a 20 20 2a 2a 20 69 6e 20 61 53 61  ples.  ** in aSa
12670 6d 70 6c 65 20 69 73 3a 0a 20 20 2a 2a 0a 20 20  mple is:.  **.  
12680 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 30  **     aSample[0
12690 5d 20 3d 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a  ] = (a, 5) .  **
126a0 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 31 5d 20       aSample[1] 
126b0 3d 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20  = (a, 10) .  ** 
126c0 20 20 20 20 61 53 61 6d 70 6c 65 5b 32 5d 20 3d      aSample[2] =
126d0 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20   (b, 5) .  **   
126e0 20 20 61 53 61 6d 70 6c 65 5b 33 5d 20 3d 20 28    aSample[3] = (
126f0 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20  c, 100) .  **   
12700 20 20 61 53 61 6d 70 6c 65 5b 34 5d 20 3d 20 28    aSample[4] = (
12710 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a  c, 105).  **.  *
12720 2a 20 54 68 65 6e 20 74 68 65 20 73 65 61 72 63  * Then the searc
12730 68 20 73 70 61 63 65 20 73 68 6f 75 6c 64 20 69  h space should i
12740 64 65 61 6c 6c 79 20 62 65 20 74 68 65 20 73 61  deally be the sa
12750 6d 70 6c 65 73 20 61 62 6f 76 65 20 61 6e 64 20  mples above and 
12760 74 68 65 20 0a 20 20 2a 2a 20 75 6e 69 71 75 65  the .  ** unique
12770 20 70 72 65 66 69 78 65 73 20 5b 61 5d 2c 20 5b   prefixes [a], [
12780 62 5d 20 61 6e 64 20 5b 63 5d 2e 20 42 75 74 20  b] and [c]. But 
12790 73 69 6e 63 65 20 74 68 61 74 20 69 73 20 68 61  since that is ha
127a0 72 64 20 74 6f 20 6f 72 67 61 6e 69 7a 65 2c 20  rd to organize, 
127b0 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 20 61  .  ** the code a
127c0 63 74 75 61 6c 6c 79 20 73 65 61 72 63 68 65 73  ctually searches
127d0 20 74 68 69 73 20 73 65 74 3a 0a 20 20 2a 2a 0a   this set:.  **.
127e0 20 20 2a 2a 20 20 20 20 20 30 3a 20 28 61 29 20    **     0: (a) 
127f0 0a 20 20 2a 2a 20 20 20 20 20 31 3a 20 28 61 2c  .  **     1: (a,
12800 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 32 3a   5) .  **     2:
12810 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20   (a, 10) .  **  
12820 20 20 20 33 3a 20 28 61 2c 20 31 30 29 20 0a 20     3: (a, 10) . 
12830 20 2a 2a 20 20 20 20 20 34 3a 20 28 62 29 20 0a   **     4: (b) .
12840 20 20 2a 2a 20 20 20 20 20 35 3a 20 28 62 2c 20    **     5: (b, 
12850 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 36 3a 20  5) .  **     6: 
12860 28 63 29 20 0a 20 20 2a 2a 20 20 20 20 20 37 3a  (c) .  **     7:
12870 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20   (c, 100) .  ** 
12880 20 20 20 20 38 3a 20 28 63 2c 20 31 30 35 29 0a      8: (c, 105).
12890 20 20 2a 2a 20 20 20 20 20 39 3a 20 28 63 2c 20    **     9: (c, 
128a0 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  105).  **.  ** F
128b0 6f 72 20 65 61 63 68 20 73 61 6d 70 6c 65 20 69  or each sample i
128c0 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20  n the aSample[] 
128d0 61 72 72 61 79 2c 20 4e 20 73 61 6d 70 6c 65 73  array, N samples
128e0 20 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20   are present in 
128f0 74 68 65 0a 20 20 2a 2a 20 65 66 66 65 63 74 69  the.  ** effecti
12900 76 65 20 73 61 6d 70 6c 65 20 61 72 72 61 79 2e  ve sample array.
12910 20 49 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 73   In the above, s
12920 61 6d 70 6c 65 73 20 30 20 61 6e 64 20 31 20 61  amples 0 and 1 a
12930 72 65 20 62 61 73 65 64 20 6f 6e 20 0a 20 20 2a  re based on .  *
12940 2a 20 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65  * sample aSample
12950 5b 30 5d 2e 20 53 61 6d 70 6c 65 73 20 32 20 61  [0]. Samples 2 a
12960 6e 64 20 33 20 6f 6e 20 61 53 61 6d 70 6c 65 5b  nd 3 on aSample[
12970 31 5d 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a  1] etc..  **.  *
12980 2a 20 4f 66 74 65 6e 2c 20 73 61 6d 70 6c 65 20  * Often, sample 
12990 69 20 6f 66 20 65 61 63 68 20 62 6c 6f 63 6b 20  i of each block 
129a0 6f 66 20 4e 20 65 66 66 65 63 74 69 76 65 20 73  of N effective s
129b0 61 6d 70 6c 65 73 20 68 61 73 20 28 69 2b 31 29  amples has (i+1)
129c0 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2a 20 45 78   fields..  ** Ex
129d0 63 65 70 74 2c 20 65 61 63 68 20 73 61 6d 70 6c  cept, each sampl
129e0 65 20 6d 61 79 20 62 65 20 65 78 74 65 6e 64 65  e may be extende
129f0 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  d to ensure that
12a00 20 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74   it is greater t
12a10 68 61 6e 20 6f 72 0a 20 20 2a 2a 20 65 71 75 61  han or.  ** equa
12a20 6c 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  l to the previou
12a30 73 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20  s sample in the 
12a40 61 72 72 61 79 2e 20 46 6f 72 20 65 78 61 6d 70  array. For examp
12a50 6c 65 2c 20 69 6e 20 74 68 65 20 61 62 6f 76 65  le, in the above
12a60 2c 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 32  , .  ** sample 2
12a70 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73 61   is the first sa
12a80 6d 70 6c 65 20 6f 66 20 61 20 62 6c 6f 63 6b 20  mple of a block 
12a90 6f 66 20 4e 20 73 61 6d 70 6c 65 73 2c 20 73 6f  of N samples, so
12aa0 20 61 74 20 66 69 72 73 74 20 69 74 20 0a 20 20   at first it .  
12ab0 2a 2a 20 61 70 70 65 61 72 73 20 74 68 61 74 20  ** appears that 
12ac0 69 74 20 73 68 6f 75 6c 64 20 62 65 20 31 20 66  it should be 1 f
12ad0 69 65 6c 64 20 69 6e 20 73 69 7a 65 2e 20 48 6f  ield in size. Ho
12ae0 77 65 76 65 72 2c 20 74 68 61 74 20 77 6f 75 6c  wever, that woul
12af0 64 20 6d 61 6b 65 20 69 74 20 0a 20 20 2a 2a 20  d make it .  ** 
12b00 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d  smaller than sam
12b10 70 6c 65 20 31 2c 20 73 6f 20 74 68 65 20 62 69  ple 1, so the bi
12b20 6e 61 72 79 20 73 65 61 72 63 68 20 77 6f 75 6c  nary search woul
12b30 64 20 6e 6f 74 20 77 6f 72 6b 2e 20 41 73 20 61  d not work. As a
12b40 20 72 65 73 75 6c 74 2c 20 0a 20 20 2a 2a 20 69   result, .  ** i
12b50 74 20 69 73 20 65 78 74 65 6e 64 65 64 20 74 6f  t is extended to
12b60 20 74 77 6f 20 66 69 65 6c 64 73 2e 20 54 68 65   two fields. The
12b70 20 64 75 70 6c 69 63 61 74 65 73 20 74 68 61 74   duplicates that
12b80 20 74 68 69 73 20 63 72 65 61 74 65 73 20 64 6f   this creates do
12b90 20 6e 6f 74 20 0a 20 20 2a 2a 20 63 61 75 73 65   not .  ** cause
12ba0 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20   any problems.. 
12bb0 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70   */.  nField = p
12bc0 52 65 63 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 69  Rec->nField;.  i
12bd0 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 53 61 6d 70  Col = 0;.  iSamp
12be0 6c 65 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70  le = pIdx->nSamp
12bf0 6c 65 20 2a 20 6e 46 69 65 6c 64 3b 0a 20 20 64  le * nField;.  d
12c00 6f 7b 0a 20 20 20 20 69 6e 74 20 69 53 61 6d 70  o{.    int iSamp
12c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12c20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
12c30 20 61 53 61 6d 70 6c 65 5b 5d 20 6f 66 20 74 65   aSample[] of te
12c40 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 20  st sample */.   
12c50 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
12c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12c70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  * Number of fiel
12c80 64 73 20 69 6e 20 74 65 73 74 20 73 61 6d 70 6c  ds in test sampl
12c90 65 20 2a 2f 0a 0a 20 20 20 20 69 54 65 73 74 20  e */..    iTest 
12ca0 3d 20 28 69 4d 69 6e 2b 69 53 61 6d 70 6c 65 29  = (iMin+iSample)
12cb0 2f 32 3b 0a 20 20 20 20 69 53 61 6d 70 20 3d 20  /2;.    iSamp = 
12cc0 69 54 65 73 74 20 2f 20 6e 46 69 65 6c 64 3b 0a  iTest / nField;.
12cd0 20 20 20 20 69 66 28 20 69 53 61 6d 70 3e 30 20      if( iSamp>0 
12ce0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
12cf0 70 72 6f 70 6f 73 65 64 20 65 66 66 65 63 74 69  proposed effecti
12d00 76 65 20 73 61 6d 70 6c 65 20 69 73 20 61 20 70  ve sample is a p
12d10 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20  refix of sample 
12d20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a  aSample[iSamp]..
12d30 20 20 20 20 20 20 2a 2a 20 53 70 65 63 69 66 69        ** Specifi
12d40 63 61 6c 6c 79 2c 20 74 68 65 20 73 68 6f 72 74  cally, the short
12d50 65 73 74 20 70 72 65 66 69 78 20 6f 66 20 61 74  est prefix of at
12d60 20 6c 65 61 73 74 20 28 31 20 2b 20 69 54 65 73   least (1 + iTes
12d70 74 25 6e 46 69 65 6c 64 29 20 0a 20 20 20 20 20  t%nField) .     
12d80 20 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20   ** fields that 
12d90 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
12da0 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 66 66  the previous eff
12db0 65 63 74 69 76 65 20 73 61 6d 70 6c 65 2e 20 20  ective sample.  
12dc0 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 28  */.      for(n=(
12dd0 69 54 65 73 74 20 25 20 6e 46 69 65 6c 64 29 20  iTest % nField) 
12de0 2b 20 31 3b 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e  + 1; n<nField; n
12df0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
12e00 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 2d 31   aSample[iSamp-1
12e10 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61  ].anLt[n-1]!=aSa
12e20 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74  mple[iSamp].anLt
12e30 5b 6e 2d 31 5d 20 29 20 62 72 65 61 6b 3b 0a 20  [n-1] ) break;. 
12e40 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
12e50 7b 0a 20 20 20 20 20 20 6e 20 3d 20 69 54 65 73  {.      n = iTes
12e60 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  t + 1;.    }..  
12e70 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
12e80 20 6e 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71   n;.    res = sq
12e90 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
12ea0 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
12eb0 53 61 6d 70 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  Samp].n, aSample
12ec0 5b 69 53 61 6d 70 5d 2e 70 2c 20 70 52 65 63 29  [iSamp].p, pRec)
12ed0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20  ;.    if( res<0 
12ee0 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20  ){.      iLower 
12ef0 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  = aSample[iSamp]
12f00 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 2b 20 61 53 61  .anLt[n-1] + aSa
12f10 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 45 71  mple[iSamp].anEq
12f20 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69  [n-1];.      iMi
12f30 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20  n = iTest+1;.   
12f40 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3d 3d   }else if( res==
12f50 30 20 26 26 20 6e 3c 6e 46 69 65 6c 64 20 29 7b  0 && n<nField ){
12f60 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20  .      iLower = 
12f70 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61  aSample[iSamp].a
12f80 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20  nLt[n-1];.      
12f90 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a  iMin = iTest+1;.
12fa0 20 20 20 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a        res = -1;.
12fb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12fc0 20 69 53 61 6d 70 6c 65 20 3d 20 69 54 65 73 74   iSample = iTest
12fd0 3b 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6e  ;.      iCol = n
12fe0 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  -1;.    }.  }whi
12ff0 6c 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c  le( res && iMin<
13000 69 53 61 6d 70 6c 65 20 29 3b 0a 20 20 69 20 3d  iSample );.  i =
13010 20 69 53 61 6d 70 6c 65 20 2f 20 6e 46 69 65 6c   iSample / nFiel
13020 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d;..#ifdef SQLIT
13030 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
13040 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
13050 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65  t statements che
13060 63 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e 61  ck that the bina
13070 72 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20  ry search code. 
13080 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20   ** above found 
13090 74 68 65 20 72 69 67 68 74 20 61 6e 73 77 65 72  the right answer
130a0 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72  . This block ser
130b0 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f  ves no purpose o
130c0 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74  ther.  ** than t
130d0 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73  o invoke the ass
130e0 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20  erts.  */.  if( 
130f0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
13100 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
13110 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
13120 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 28 72 65  .      /* If (re
13130 73 3d 3d 30 29 20 69 73 20 74 72 75 65 2c 20 74  s==0) is true, t
13140 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20 62 65  hen pRec must be
13150 20 65 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65   equal to sample
13160 20 69 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73   i. */.      ass
13170 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61  ert( i<pIdx->nSa
13180 6d 70 6c 65 20 29 3b 0a 20 20 20 20 20 20 61 73  mple );.      as
13190 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65  sert( iCol==nFie
131a0 6c 64 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 52  ld-1 );.      pR
131b0 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69  ec->nField = nFi
131c0 65 6c 64 3b 0a 20 20 20 20 20 20 61 73 73 65 72  eld;.      asser
131d0 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 56 64 62  t( 0==sqlite3Vdb
131e0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
131f0 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61  Sample[i].n, aSa
13200 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29  mple[i].p, pRec)
13210 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13220 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
13230 6f 63 46 61 69 6c 65 64 20 0a 20 20 20 20 20 20  ocFailed .      
13240 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13250 20 20 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 3d      /* Unless i=
13260 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20  =pIdx->nSample, 
13270 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
13280 70 52 65 63 20 69 73 20 6c 61 72 67 65 72 20 74  pRec is larger t
13290 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  han.      ** all
132a0 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20   samples in the 
132b0 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c  aSample[] array,
132c0 20 70 52 65 63 20 6d 75 73 74 20 62 65 20 73 6d   pRec must be sm
132d0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 0a 20  aller than the. 
132e0 20 20 20 20 20 2a 2a 20 28 69 43 6f 6c 2b 31 29       ** (iCol+1)
132f0 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66   field prefix of
13300 20 73 61 6d 70 6c 65 20 69 2e 20 20 2a 2f 0a 20   sample i.  */. 
13310 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 3d       assert( i<=
13320 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 26 26  pIdx->nSample &&
13330 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 70   i>=0 );.      p
13340 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43  Rec->nField = iC
13350 6f 6c 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65  ol+1;.      asse
13360 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61  rt( i==pIdx->nSa
13370 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20  mple .          
13380 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52   || sqlite3VdbeR
13390 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
133a0 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
133b0 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30  le[i].p, pRec)>0
133c0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
133d0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
133e0 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20  cFailed );..    
133f0 20 20 2f 2a 20 69 66 20 69 3d 3d 30 20 61 6e 64    /* if i==0 and
13400 20 69 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 72   iCol==0, then r
13410 65 63 6f 72 64 20 70 52 65 63 20 69 73 20 73 6d  ecord pRec is sm
13420 61 6c 6c 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  aller than all s
13430 61 6d 70 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20  amples.      ** 
13440 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d  in the aSample[]
13450 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73   array. Otherwis
13460 65 2c 20 69 66 20 28 69 43 6f 6c 3e 30 29 20 74  e, if (iCol>0) t
13470 68 65 6e 20 70 52 65 63 20 6d 75 73 74 0a 20 20  hen pRec must.  
13480 20 20 20 20 2a 2a 20 62 65 20 67 72 65 61 74 65      ** be greate
13490 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
134a0 74 6f 20 74 68 65 20 28 69 43 6f 6c 29 20 66 69  to the (iCol) fi
134b0 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73 61  eld prefix of sa
134c0 6d 70 6c 65 20 69 2e 0a 20 20 20 20 20 20 2a 2a  mple i..      **
134d0 20 49 66 20 28 69 3e 30 29 2c 20 74 68 65 6e 20   If (i>0), then 
134e0 70 52 65 63 20 6d 75 73 74 20 61 6c 73 6f 20 62  pRec must also b
134f0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 73  e greater than s
13500 61 6d 70 6c 65 20 28 69 2d 31 29 2e 20 20 2a 2f  ample (i-1).  */
13510 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  .      if( iCol>
13520 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65  0 ){.        pRe
13530 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c  c->nField = iCol
13540 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
13550 28 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  ( sqlite3VdbeRec
13560 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
13570 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
13580 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3c 3d 30 0a  [i].p, pRec)<=0.
13590 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
135a0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
135b0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
135c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e    }.      if( i>
135d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65  0 ){.        pRe
135e0 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65  c->nField = nFie
135f0 6c 64 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ld;.        asse
13600 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 52  rt( sqlite3VdbeR
13610 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
13620 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61  mple[i-1].n, aSa
13630 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65  mple[i-1].p, pRe
13640 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20 20 20  c)<0.           
13650 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
13660 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
13670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13680 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64   }.#endif /* ifd
13690 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
136a0 2a 2f 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d 30  */..  if( res==0
136b0 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72   ){.    /* Recor
136c0 64 20 70 52 65 63 20 69 73 20 65 71 75 61 6c 20  d pRec is equal 
136d0 74 6f 20 73 61 6d 70 6c 65 20 69 20 2a 2f 0a 20  to sample i */. 
136e0 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
136f0 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20  =nField-1 );.   
13700 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d   aStat[0] = aSam
13710 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c  ple[i].anLt[iCol
13720 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  ];.    aStat[1] 
13730 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45  = aSample[i].anE
13740 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65  q[iCol];.  }else
13750 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  {.    /* At this
13760 20 70 6f 69 6e 74 2c 20 74 68 65 20 28 69 43 6f   point, the (iCo
13770 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66 69  l+1) field prefi
13780 78 20 6f 66 20 61 53 61 6d 70 6c 65 5b 69 5d 20  x of aSample[i] 
13790 69 73 20 74 68 65 20 66 69 72 73 74 20 0a 20 20  is the first .  
137a0 20 20 2a 2a 20 73 61 6d 70 6c 65 20 74 68 61 74    ** sample that
137b0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
137c0 20 70 52 65 63 2e 20 4f 72 2c 20 69 66 20 69 3d   pRec. Or, if i=
137d0 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 74  =pIdx->nSample t
137e0 68 65 6e 20 70 52 65 63 0a 20 20 20 20 2a 2a 20  hen pRec.    ** 
137f0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61  is larger than a
13800 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68  ll samples in th
13810 65 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20  e array. */.    
13820 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72 2c 20  tRowcnt iUpper, 
13830 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3e  iGap;.    if( i>
13840 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29  =pIdx->nSample )
13850 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  {.      iUpper =
13860 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
13870 49 6e 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c  Int(pIdx->aiRowL
13880 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 7d  ogEst[0]);.    }
13890 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70  else{.      iUpp
138a0 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  er = aSample[i].
138b0 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
138c0 7d 0a 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65  }..    if( iLowe
138d0 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20  r>=iUpper ){.   
138e0 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20     iGap = 0;.   
138f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
13900 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c  ap = iUpper - iL
13910 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ower;.    }.    
13920 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20  if( roundUp ){. 
13930 20 20 20 20 20 69 47 61 70 20 3d 20 28 69 47 61       iGap = (iGa
13940 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73  p*2)/3;.    }els
13950 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
13960 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20  iGap/3;.    }.  
13970 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f    aStat[0] = iLo
13980 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 20 20  wer + iGap;.    
13990 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d  aStat[1] = pIdx-
139a0 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d 3b 0a 20  >aAvgEq[iCol];. 
139b0 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65   }..  /* Restore
139c0 20 74 68 65 20 70 52 65 63 2d 3e 6e 46 69 65 6c   the pRec->nFiel
139d0 64 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72  d value before r
139e0 65 74 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20  eturning.  */.  
139f0 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  pRec->nField = n
13a00 46 69 65 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20  Field;.  return 
13a10 69 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  i;.}.#endif /* S
13a20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
13a30 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
13a40 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e  /*.** If it is n
13a50 6f 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20 69  ot NULL, pTerm i
13a60 73 20 61 20 74 65 72 6d 20 74 68 61 74 20 70 72  s a term that pr
13a70 6f 76 69 64 65 73 20 61 6e 20 75 70 70 65 72 20  ovides an upper 
13a80 6f 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e  or lower.** boun
13a90 64 20 6f 6e 20 61 20 72 61 6e 67 65 20 73 63 61  d on a range sca
13aa0 6e 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e 73 69  n. Without consi
13ab0 64 65 72 69 6e 67 20 70 54 65 72 6d 2c 20 69 74  dering pTerm, it
13ac0 20 69 73 20 65 73 74 69 6d 61 74 65 64 20 0a 2a   is estimated .*
13ad0 2a 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20  * that the scan 
13ae0 77 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77 20  will visit nNew 
13af0 72 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74  rows. This funct
13b00 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
13b10 6e 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d 61  number.** estima
13b20 74 65 64 20 74 6f 20 62 65 20 76 69 73 69 74 65  ted to be visite
13b30 64 20 61 66 74 65 72 20 74 61 6b 69 6e 67 20 70  d after taking p
13b40 54 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75 6e  Term into accoun
13b50 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
13b60 75 73 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20  user explicitly 
13b70 73 70 65 63 69 66 69 65 64 20 61 20 6c 69 6b 65  specified a like
13b80 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 20 66  lihood() value f
13b90 6f 72 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a 2a  or this term,.**
13ba0 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
13bb0 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6c 69   value is the li
13bc0 6b 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70 6c  kelihood multipl
13bd0 69 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ied by the numbe
13be0 72 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72 6f  r of.** input ro
13bf0 77 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ws. Otherwise, t
13c00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
13c10 75 6d 65 73 20 74 68 61 74 20 61 6e 20 22 49 53  umes that an "IS
13c20 20 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d 0a   NOT NULL" term.
13c30 2a 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c 69 68  ** has a likelih
13c40 6f 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e 64  ood of 0.50, and
13c50 20 61 6e 79 20 6f 74 68 65 72 20 74 65 72 6d 20   any other term 
13c60 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20  a likelihood of 
13c70 30 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  0.25..*/.static 
13c80 4c 6f 67 45 73 74 20 77 68 65 72 65 52 61 6e 67  LogEst whereRang
13c90 65 41 64 6a 75 73 74 28 57 68 65 72 65 54 65 72  eAdjust(WhereTer
13ca0 6d 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73 74  m *pTerm, LogEst
13cb0 20 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73 74   nNew){.  LogEst
13cc0 20 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20   nRet = nNew;.  
13cd0 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
13ce0 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74   if( pTerm->trut
13cf0 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20  hProb<=0 ){.    
13d00 20 20 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d 2d    nRet += pTerm-
13d10 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20  >truthProb;.    
13d20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d  }else if( (pTerm
13d30 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
13d40 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  _VNULL)==0 ){.  
13d50 20 20 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b 20      nRet -= 20; 
13d60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32         assert( 2
13d70 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
13d80 28 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (4) );.    }.  }
13d90 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a  .  return nRet;.
13da0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
13db0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
13dc0 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54 68  _STAT4./* .** Th
13dd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
13de0 61 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d 61 74  alled to estimat
13df0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
13e00 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  rows visited by 
13e10 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61 6e 20  a.** range-scan 
13e20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69  on a skip-scan i
13e30 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ndex. For exampl
13e40 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  e:.**.**   CREAT
13e50 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
13e60 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20 20 20  (a, b, c);.**   
13e70 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
13e80 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 63   WHERE a=? AND c
13e90 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
13ea0 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20 70 4c  ;.**.** Value pL
13eb0 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63 75 72  oop->nOut is cur
13ec0 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68  rently set to th
13ed0 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
13ee0 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a 20 76  er of rows .** v
13ef0 69 73 69 74 65 64 20 66 6f 72 20 73 63 61 6e 6e  isited for scann
13f00 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62 3d 3f  ing (a=? AND b=?
13f10 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ). This function
13f20 20 72 65 64 75 63 65 73 20 74 68 61 74 20 65 73   reduces that es
13f30 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20 73 6f  timate .** by so
13f40 6d 65 20 66 61 63 74 6f 72 20 74 6f 20 61 63 63  me factor to acc
13f50 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28 63 20  ount for the (c 
13f60 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29  BETWEEN ? AND ?)
13f70 20 65 78 70 72 65 73 73 69 6f 6e 20 62 61 73 65   expression base
13f80 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 74  d.** on the stat
13f90 34 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 69  4 data for the i
13fa0 6e 64 65 78 2e 20 74 68 69 73 20 73 63 61 6e 20  ndex. this scan 
13fb0 77 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d 65 64  will be peformed
13fc0 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69   multiple .** ti
13fd0 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72 20 65 61  mes (once for ea
13fe0 63 68 20 28 61 2c 62 29 20 63 6f 6d 62 69 6e 61  ch (a,b) combina
13ff0 74 69 6f 6e 20 74 68 61 74 20 6d 61 74 63 68 65  tion that matche
14000 73 20 61 3d 3f 29 20 69 73 20 64 65 61 6c 74 20  s a=?) is dealt 
14010 77 69 74 68 20 0a 2a 2a 20 62 79 20 74 68 65 20  with .** by the 
14020 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 74  caller..**.** It
14030 20 64 6f 65 73 20 74 68 69 73 20 62 79 20 73 63   does this by sc
14040 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
14050 6c 6c 20 73 74 61 74 34 20 73 61 6d 70 6c 65 73  ll stat4 samples
14060 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75  , comparing valu
14070 65 73 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20  es.** extracted 
14080 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20  from pLower and 
14090 70 55 70 70 65 72 20 77 69 74 68 20 74 68 65 20  pUpper with the 
140a0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
140b0 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a 2a 20  lumn in each.** 
140c0 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61 6e 64  sample. If L and
140d0 20 55 20 61 72 65 20 74 68 65 20 6e 75 6d 62 65   U are the numbe
140e0 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f 75  r of samples fou
140f0 6e 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  nd to be less th
14100 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20 74  an or.** equal t
14110 6f 20 74 68 65 20 76 61 6c 75 65 73 20 65 78 74  o the values ext
14120 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77  racted from pLow
14130 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65  er and pUpper re
14140 73 70 65 63 74 69 76 65 6c 79 2c 20 61 6e 64 0a  spectively, and.
14150 2a 2a 20 4e 20 69 73 20 74 68 65 20 74 6f 74 61  ** N is the tota
14160 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70  l number of samp
14170 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70 2d 3e  les, the pLoop->
14180 6e 4f 75 74 20 76 61 6c 75 65 20 69 73 20 61 64  nOut value is ad
14190 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20 66 6f 6c  justed.** as fol
141a0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f  lows:.**.**   nO
141b0 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20 6d 69  ut = nOut * ( mi
141c0 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20 4e 20  n(U - L, 1) / N 
141d0 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77 65  ).**.** If pLowe
141e0 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20  r is NULL, or a 
141f0 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20  value cannot be 
14200 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
14210 68 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a 2a 2a  he term, L is.**
14220 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 49 66   set to zero. If
14230 20 70 55 70 70 65 72 20 69 73 20 4e 55 4c 4c 2c   pUpper is NULL,
14240 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e   or a value cann
14250 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20  ot be extracted 
14260 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20 69 73  from it,.** U is
14270 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a   set to N..**.**
14280 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
14290 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a 70  function sets *p
142a0 62 44 6f 6e 65 20 74 6f 20 31 20 62 65 66 6f 72  bDone to 1 befor
142b0 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 48 6f 77  e returning. How
142c0 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20 76  ever,.** if no v
142d0 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78 74 72  alue can be extr
142e0 61 63 74 65 64 20 66 72 6f 6d 20 65 69 74 68 65  acted from eithe
142f0 72 20 70 4c 6f 77 65 72 20 6f 72 20 70 55 70 70  r pLower or pUpp
14300 65 72 20 28 61 6e 64 20 73 6f 20 74 68 65 0a 2a  er (and so the.*
14310 2a 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  * estimate of th
14320 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
14330 20 64 65 6c 69 76 65 72 65 64 20 72 65 6d 61 69   delivered remai
14340 6e 73 20 75 6e 63 68 61 6e 67 65 64 29 2c 20 2a  ns unchanged), *
14350 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65 66  pbDone.** is lef
14360 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 49  t as is..**.** I
14370 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
14380 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
14390 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
143a0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
143b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  .** SQLITE_OK..*
143c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
143d0 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45  reRangeSkipScanE
143e0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
143f0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
14400 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
14410 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
14420 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
14430 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77  pLower,   /* Low
14440 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
14450 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32  range. ex: "x>12
14460 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  3" Might be NULL
14470 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
14480 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70  *pUpper,   /* Up
14490 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
144a0 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34   range. ex: "x<4
144b0 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  55" Might be NUL
144c0 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  L */.  WhereLoop
144d0 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20 55   *pLoop,    /* U
144e0 70 64 61 74 65 20 74 68 65 20 2e 6e 4f 75 74 20  pdate the .nOut 
144f0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 6c 6f  value of this lo
14500 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44  op */.  int *pbD
14510 6f 6e 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20  one          /* 
14520 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  Set to true if a
14530 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 78 70 72  t least one expr
14540 2e 20 76 61 6c 75 65 20 65 78 74 72 61 63 74 65  . value extracte
14550 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  d */.){.  Index 
14560 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  *p = pLoop->u.bt
14570 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
14580 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
14590 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 71  .btree.nEq;.  sq
145a0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
145b0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 4c  se->db;.  int nL
145c0 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  ower = -1;.  int
145d0 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e 53 61   nUpper = p->nSa
145e0 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20 72 63  mple+1;.  int rc
145f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14600 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 61 69  int iCol = p->ai
14610 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 75  Column[nEq];.  u
14620 38 20 61 66 66 20 3d 20 69 43 6f 6c 3e 3d 30 20  8 aff = iCol>=0 
14630 3f 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  ? p->pTable->aCo
14640 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79  l[iCol].affinity
14650 20 3a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   : SQLITE_AFF_IN
14660 54 45 47 45 52 3b 0a 20 20 43 6f 6c 6c 53 65 71  TEGER;.  CollSeq
14670 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71   *pColl;.  .  sq
14680 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 31 20  lite3_value *p1 
14690 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
146a0 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64   Value extracted
146b0 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a   from pLower */.
146c0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
146d0 2a 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *p2 = 0;        
146e0 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61    /* Value extra
146f0 63 74 65 64 20 66 72 6f 6d 20 70 55 70 70 65 72  cted from pUpper
14700 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
14710 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20  lue *pVal = 0;  
14720 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65        /* Value e
14730 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65  xtracted from re
14740 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c  cord */..  pColl
14750 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
14760 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
14770 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b  p->azColl[nEq]);
14780 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b  .  if( pLower ){
14790 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
147a0 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45  3Stat4ValueFromE
147b0 78 70 72 28 70 50 61 72 73 65 2c 20 70 4c 6f 77  xpr(pParse, pLow
147c0 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
147d0 74 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a 20 20  t, aff, &p1);.  
147e0 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    nLower = 0;.  
147f0 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 26  }.  if( pUpper &
14800 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
14810 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
14820 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f  te3Stat4ValueFro
14830 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 55  mExpr(pParse, pU
14840 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  pper->pExpr->pRi
14850 67 68 74 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a  ght, aff, &p2);.
14860 20 20 20 20 6e 55 70 70 65 72 20 3d 20 70 32 20      nUpper = p2 
14870 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65  ? 0 : p->nSample
14880 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 31 20  ;.  }..  if( p1 
14890 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20 69 6e 74  || p2 ){.    int
148a0 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69 66   i;.    int nDif
148b0 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  f;.    for(i=0; 
148c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
148d0 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69   i<p->nSample; i
148e0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
148f0 73 71 6c 69 74 65 33 53 74 61 74 34 43 6f 6c 75  sqlite3Stat4Colu
14900 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c  mn(db, p->aSampl
14910 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70  e[i].p, p->aSamp
14920 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70  le[i].n, nEq, &p
14930 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Val);.      if( 
14940 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14950 20 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69   p1 ){.        i
14960 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33  nt res = sqlite3
14970 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20 70  MemCompare(p1, p
14980 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20  Val, pColl);.   
14990 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20       if( res>=0 
149a0 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20  ) nLower++;.    
149b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
149c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
149d0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  2 ){.        int
149e0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65   res = sqlite3Me
149f0 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20 70 56 61  mCompare(p2, pVa
14a00 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  l, pColl);.     
14a10 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20     if( res>=0 ) 
14a20 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20  nUpper++;.      
14a30 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 69 66  }.    }.    nDif
14a40 66 20 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c  f = (nUpper - nL
14a50 6f 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20 6e  ower);.    if( n
14a60 44 69 66 66 3c 3d 30 20 29 20 6e 44 69 66 66 20  Diff<=0 ) nDiff 
14a70 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  = 1;..    /* If 
14a80 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e  there is both an
14a90 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72   upper and lower
14aa0 20 62 6f 75 6e 64 20 73 70 65 63 69 66 69 65 64   bound specified
14ab0 2c 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  , and the .    *
14ac0 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e  * comparisons in
14ad0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 79  dicate that they
14ae0 20 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74   are close toget
14af0 68 65 72 2c 20 75 73 65 20 74 68 65 20 66 61 6c  her, use the fal
14b00 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74  lback.    ** met
14b10 68 6f 64 20 28 61 73 73 75 6d 65 20 74 68 61 74  hod (assume that
14b20 20 74 68 65 20 73 63 61 6e 20 76 69 73 69 74 73   the scan visits
14b30 20 31 2f 36 34 20 6f 66 20 74 68 65 20 72 6f 77   1/64 of the row
14b40 73 29 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e  s) for estimatin
14b50 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d  g.    ** the num
14b60 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69  ber of rows visi
14b70 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ted. Otherwise, 
14b80 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
14b90 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20  ber of rows.    
14ba0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 65 74  ** using the met
14bb0 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 69 6e  hod described in
14bc0 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
14bd0 65 6e 74 20 66 6f 72 20 74 68 69 73 20 66 75 6e  ent for this fun
14be0 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  ction. */.    if
14bf0 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70 55  ( nDiff!=1 || pU
14c00 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65  pper==0 || pLowe
14c10 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  r==0 ){.      in
14c20 74 20 6e 41 64 6a 75 73 74 20 3d 20 28 73 71 6c  t nAdjust = (sql
14c30 69 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53  ite3LogEst(p->nS
14c40 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74 65 33  ample) - sqlite3
14c50 4c 6f 67 45 73 74 28 6e 44 69 66 66 29 29 3b 0a  LogEst(nDiff));.
14c60 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75        pLoop->nOu
14c70 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20  t -= nAdjust;.  
14c80 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b      *pbDone = 1;
14c90 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
14ca0 45 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20  E(0x10, ("range 
14cb0 73 6b 69 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e  skip-scan region
14cc0 73 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a 75 73  s: %u..%u  adjus
14cd0 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a  t=%d est=%d\n",.
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cf0 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 77 65             nLowe
14d00 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75  r, nUpper, nAdju
14d10 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f  st*-1, pLoop->nO
14d20 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  ut));.    }..  }
14d30 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
14d40 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a  ( *pbDone==0 );.
14d50 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61    }..  sqlite3Va
14d60 6c 75 65 46 72 65 65 28 70 31 29 3b 0a 20 20 73  lueFree(p1);.  s
14d70 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
14d80 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  p2);.  sqlite3Va
14d90 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a  lueFree(pVal);..
14da0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
14db0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
14dc0 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
14dd0 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT4 */../*.** 
14de0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
14df0 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74   used to estimat
14e00 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
14e10 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
14e20 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20  e visited.** by 
14e30 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65  scanning an inde
14e40 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66  x for a range of
14e50 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e   values. The ran
14e60 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75  ge may have an u
14e70 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61  pper.** bound, a
14e80 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72   lower bound, or
14e90 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45   both. The WHERE
14ea0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68   clause terms th
14eb0 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65 72  at set the upper
14ec0 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f  .** and lower bo
14ed0 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73 65  unds are represe
14ee0 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61  nted by pLower a
14ef0 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63  nd pUpper respec
14f00 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65  tively. For.** e
14f10 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67  xample, assuming
14f20 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69 73   that index p is
14f30 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a   on t1(a):.**.**
14f40 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
14f50 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
14f60 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20   < ? ....**     
14f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
14f80 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c  _____|   |_____|
14f90 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
14fa0 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
14fb0 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
14fd0 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a  wer    pUpper.**
14fe0 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66  .** If either of
14ff0 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f   the upper or lo
15000 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74  wer bound is not
15010 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e   present, then N
15020 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e  ULL is passed in
15030 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65  .** place of the
15040 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57   corresponding W
15050 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
15060 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70 42  The value in (pB
15070 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
15080 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74 68  btree.nEq) is th
15090 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
150a0 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  index.** column 
150b0 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72  subject to the r
150c0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e  ange constraint.
150d0 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c   Or, equivalentl
150e0 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
150f0 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  .** equality con
15100 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a  straints optimiz
15110 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73  ed by the propos
15120 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46  ed index scan. F
15130 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61  or example,.** a
15140 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20  ssuming index p 
15150 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20  is on t1(a, b), 
15160 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72  and the SQL quer
15170 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
15180 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
15190 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20  a = ? AND b > ? 
151a0 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND b < ? ....**
151b0 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20  .** then nEq is 
151c0 73 65 74 20 74 6f 20 31 20 28 61 73 20 74 68 65  set to 1 (as the
151d0 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65   range restricte
151e0 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20  d column, b, is 
151f0 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c  the second .** l
15200 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
15210 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f  of the index). O
15220 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  r, if the query 
15230 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
15240 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
15250 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
15260 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
15270 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
15280 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
15290 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
152a0 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20  , *pnOut is set 
152b0 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f  to the sqlite3Lo
152c0 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a  gEst() of the.**
152d0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
152e0 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 73  that the index s
152f0 63 61 6e 20 69 73 20 65 78 70 65 63 74 65 64 20  can is expected 
15300 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75 74  to visit without
15310 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67   .** considering
15320 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74   the range const
15330 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69  raints. If nEq i
15340 73 20 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74  s 0, then *pnOut
15350 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
15360 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68  f .** rows in th
15370 65 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e  e index. Assumin
15380 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  g no error occur
15390 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a  s, *pnOut is adj
153a0 75 73 74 65 64 20 28 72 65 64 75 63 65 64 29 0a  usted (reduced).
153b0 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  ** to account fo
153c0 72 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73  r the range cons
153d0 74 72 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61  traints pLower a
153e0 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a  nd pUpper..** .*
153f0 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65  * In the absence
15400 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34   of sqlite_stat4
15410 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f   ANALYZE data, o
15420 72 20 69 66 20 73 75 63 68 20 64 61 74 61 20 63  r if such data c
15430 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64  annot be.** used
15440 2c 20 61 20 73 69 6e 67 6c 65 20 72 61 6e 67 65  , a single range
15450 20 69 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75   inequality redu
15460 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73  ces the search s
15470 70 61 63 65 20 62 79 20 61 20 66 61 63 74 6f 72  pace by a factor
15480 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61   of 4. .** and a
15490 20 70 61 69 72 20 6f 66 20 63 6f 6e 73 74 72 61   pair of constra
154a0 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c  ints (x>? AND x<
154b0 3f 29 20 72 65 64 75 63 65 73 20 74 68 65 20 65  ?) reduces the e
154c0 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f  xpected number o
154d0 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69 74 65  f.** rows visite
154e0 64 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  d by a factor of
154f0 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   64..*/.static i
15500 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63 61  nt whereRangeSca
15510 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
15520 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
15530 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
15540 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
15550 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
15560 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
15570 72 2c 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  r,.  WhereTerm *
15580 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77  pLower,   /* Low
15590 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
155a0 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32  range. ex: "x>12
155b0 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  3" Might be NULL
155c0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
155d0 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70  *pUpper,   /* Up
155e0 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
155f0 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34   range. ex: "x<4
15600 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  55" Might be NUL
15610 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  L */.  WhereLoop
15620 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d   *pLoop     /* M
15630 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f 75 74 20  odify the .nOut 
15640 61 6e 64 20 6d 61 79 62 65 20 2e 72 52 75 6e 20  and maybe .rRun 
15650 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69  fields */.){.  i
15660 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15670 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20  K;.  int nOut = 
15680 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c  pLoop->nOut;.  L
15690 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66  ogEst nNew;..#if
156a0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
156b0 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
156c0 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c  .  Index *p = pL
156d0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
156e0 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
156f0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
15700 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e  nEq;..  if( p->n
15710 53 61 6d 70 6c 65 3e 30 20 26 26 20 6e 45 71 3c  Sample>0 && nEq<
15720 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 7b  p->nSampleCol ){
15730 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 42  .    if( nEq==pB
15740 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
15750 64 20 29 7b 0a 20 20 20 20 20 20 55 6e 70 61 63  d ){.      Unpac
15760 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20  kedRecord *pRec 
15770 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63  = pBuilder->pRec
15780 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  ;.      tRowcnt 
15790 61 5b 32 5d 3b 0a 20 20 20 20 20 20 75 38 20 61  a[2];.      u8 a
157a0 66 66 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61  ff;..      /* Va
157b0 72 69 61 62 6c 65 20 69 4c 6f 77 65 72 20 77 69  riable iLower wi
157c0 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  ll be set to the
157d0 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
157e0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
157f0 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  in .      ** the
15800 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65 20   index that are 
15810 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f  less than the lo
15820 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  wer bound of the
15830 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 54 68   range query. Th
15840 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72  e.      ** lower
15850 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65   bound being the
15860 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f   concatenation o
15870 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65  f $P and $L, whe
15880 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20 20  re $P is the.   
15890 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78     ** key-prefix
158a0 20 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e   formed by the n
158b0 45 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65  Eq values matche
158c0 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45  d against the nE
158d0 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20  q left-most.    
158e0 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20    ** columns of 
158f0 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 24  the index, and $
15900 4c 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 69  L is the value i
15910 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20  n pLower..      
15920 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20  **.      ** Or, 
15930 69 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c  if pLower is NUL
15940 4c 20 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62  L or $L cannot b
15950 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
15960 20 69 74 20 28 62 65 63 61 75 73 65 20 69 74 0a   it (because it.
15970 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
15980 61 20 73 69 6d 70 6c 65 20 76 61 72 69 61 62 6c  a simple variabl
15990 65 20 6f 72 20 6c 69 74 65 72 61 6c 20 76 61 6c  e or literal val
159a0 75 65 29 2c 20 74 68 65 20 6c 6f 77 65 72 20 62  ue), the lower b
159b0 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20  ound of the.    
159c0 20 20 2a 2a 20 72 61 6e 67 65 20 69 73 20 24 50    ** range is $P
159d0 2e 20 44 75 65 20 74 6f 20 61 20 71 75 69 72 6b  . Due to a quirk
159e0 20 69 6e 20 74 68 65 20 77 61 79 20 77 68 65 72   in the way wher
159f0 65 4b 65 79 53 74 61 74 73 28 29 20 77 6f 72 6b  eKeyStats() work
15a00 73 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a  s, even.      **
15a10 20 69 66 20 24 4c 20 69 73 20 61 76 61 69 6c 61   if $L is availa
15a20 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53 74 61  ble, whereKeySta
15a30 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66  ts() is called f
15a40 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61 6e 64  or both ($P) and
15a50 20 0a 20 20 20 20 20 20 2a 2a 20 28 24 50 3a 24   .      ** ($P:$
15a60 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65  L) and the large
15a70 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74  r of the two ret
15a80 75 72 6e 65 64 20 76 61 6c 75 65 73 20 69 73 20  urned values is 
15a90 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  used..      **. 
15aa0 20 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c       ** Similarl
15ab0 79 2c 20 69 55 70 70 65 72 20 69 73 20 74 6f 20  y, iUpper is to 
15ac0 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73  be set to the es
15ad0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
15ae0 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20  mber of rows.   
15af0 20 20 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20     ** less than 
15b00 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20  the upper bound 
15b10 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65  of the range que
15b20 72 79 2e 20 57 68 65 72 65 20 74 68 65 20 75 70  ry. Where the up
15b30 70 65 72 20 62 6f 75 6e 64 0a 20 20 20 20 20 20  per bound.      
15b40 2a 2a 20 69 73 20 65 69 74 68 65 72 20 28 24 50  ** is either ($P
15b50 29 20 6f 72 20 28 24 50 3a 24 55 29 2e 20 41 67  ) or ($P:$U). Ag
15b60 61 69 6e 2c 20 65 76 65 6e 20 69 66 20 24 55 20  ain, even if $U 
15b70 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f  is available, bo
15b80 74 68 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20  th values.      
15b90 2a 2a 20 6f 66 20 69 55 70 70 65 72 20 61 72 65  ** of iUpper are
15ba0 20 72 65 71 75 65 73 74 65 64 20 6f 66 20 77 68   requested of wh
15bb0 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 61 6e  ereKeyStats() an
15bc0 64 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 75 73  d the smaller us
15bd0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
15be0 20 20 20 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72     ** The number
15bf0 20 6f 66 20 72 6f 77 73 20 62 65 74 77 65 65 6e   of rows between
15c00 20 74 68 65 20 74 77 6f 20 62 6f 75 6e 64 73 20   the two bounds 
15c10 69 73 20 74 68 65 6e 20 6a 75 73 74 20 69 55 70  is then just iUp
15c20 70 65 72 2d 69 4c 6f 77 65 72 2e 0a 20 20 20 20  per-iLower..    
15c30 20 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63    */.      tRowc
15c40 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20 20 20 2f  nt iLower;     /
15c50 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e  * Rows less than
15c60 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
15c70 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e   */.      tRowcn
15c80 74 20 69 55 70 70 65 72 3b 20 20 20 20 20 2f 2a  t iUpper;     /*
15c90 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   Rows less than 
15ca0 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20  the upper bound 
15cb0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 77  */.      int iLw
15cc0 72 49 64 78 20 3d 20 2d 32 3b 20 20 20 2f 2a 20  rIdx = -2;   /* 
15cd0 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68  aSample[] for th
15ce0 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f  e lower bound */
15cf0 0a 20 20 20 20 20 20 69 6e 74 20 69 55 70 72 49  .      int iUprI
15d00 64 78 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 61 53  dx = -1;   /* aS
15d10 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20  ample[] for the 
15d20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a  upper bound */..
15d30 20 20 20 20 20 20 69 66 28 20 70 52 65 63 20 29        if( pRec )
15d40 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
15d50 73 65 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  se( pRec->nField
15d60 21 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  !=pBuilder->nRec
15d70 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Valid );.       
15d80 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
15d90 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
15da0 6c 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lid;.      }.   
15db0 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 2d 3e 6e     if( nEq==p->n
15dc0 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
15dd0 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
15de0 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
15df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15e00 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65   aff = p->pTable
15e10 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75  ->aCol[p->aiColu
15e20 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69 6e 69 74  mn[nEq]].affinit
15e30 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  y;.      }.     
15e40 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c   /* Determine iL
15e50 6f 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20  ower and iUpper 
15e60 75 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e  using ($P) only.
15e70 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45   */.      if( nE
15e80 71 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  q==0 ){.        
15e90 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20  iLower = 0;.    
15ea0 20 20 20 20 69 55 70 70 65 72 20 3d 20 70 2d 3e      iUpper = p->
15eb0 6e 52 6f 77 45 73 74 30 3b 0a 20 20 20 20 20 20  nRowEst0;.      
15ec0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
15ed0 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c  * Note: this cal
15ee0 6c 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d  l could be optim
15ef0 69 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63  ized away - sinc
15f00 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  e the same value
15f10 73 20 6d 75 73 74 20 0a 20 20 20 20 20 20 20 20  s must .        
15f20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 72 65 71  ** have been req
15f30 75 65 73 74 65 64 20 77 68 65 6e 20 74 65 73 74  uested when test
15f40 69 6e 67 20 6b 65 79 20 24 50 20 69 6e 20 77 68  ing key $P in wh
15f50 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
15f60 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77  ).  */.        w
15f70 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
15f80 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
15f90 20 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4c 6f   a);.        iLo
15fa0 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20  wer = a[0];.    
15fb0 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30      iUpper = a[0
15fc0 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20  ] + a[1];.      
15fd0 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
15fe0 20 70 4c 6f 77 65 72 3d 3d 30 20 7c 7c 20 28 70   pLower==0 || (p
15ff0 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
16000 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
16010 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  )!=0 );.      as
16020 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20  sert( pUpper==0 
16030 7c 7c 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  || (pUpper->eOpe
16040 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57  rator & (WO_LT|W
16050 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_LE))!=0 );.   
16060 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53     assert( p->aS
16070 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
16080 20 20 20 20 20 69 66 28 20 70 2d 3e 61 53 6f 72       if( p->aSor
16090 74 4f 72 64 65 72 5b 6e 45 71 5d 20 29 7b 0a 20  tOrder[nEq] ){. 
160a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
160b0 6c 65 73 20 6f 66 20 70 4c 6f 77 65 72 20 61 6e  les of pLower an
160c0 64 20 70 55 70 70 65 72 20 61 72 65 20 73 77 61  d pUpper are swa
160d0 70 70 65 64 20 66 6f 72 20 61 20 44 45 53 43 20  pped for a DESC 
160e0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
160f0 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 2a   SWAP(WhereTerm*
16100 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72  , pLower, pUpper
16110 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
16120 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65    /* If possible
16130 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65  , improve on the
16140 20 69 4c 6f 77 65 72 20 65 73 74 69 6d 61 74 65   iLower estimate
16150 20 75 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e 20   using ($P:$L). 
16160 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  */.      if( pLo
16170 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  wer ){.        i
16180 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20  nt bOk;         
16190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
161a0 75 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65  ue if value is e
161b0 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45  xtracted from pE
161c0 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  xpr */.        E
161d0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f  xpr *pExpr = pLo
161e0 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  wer->pExpr->pRig
161f0 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
16200 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
16210 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
16220 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
16230 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62  pr, aff, nEq, &b
16240 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Ok);.        if(
16250 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
16260 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20  & bOk ){.       
16270 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b     tRowcnt iNew;
16280 0a 20 20 20 20 20 20 20 20 20 20 69 4c 77 72 49  .          iLwrI
16290 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61  dx = whereKeySta
162a0 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
162b0 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20  ec, 0, a);.     
162c0 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d       iNew = a[0]
162d0 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70   + ((pLower->eOp
162e0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
162f0 57 4f 5f 4c 45 29 29 20 3f 20 61 5b 31 5d 20 3a  WO_LE)) ? a[1] :
16300 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
16310 66 28 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29  f( iNew>iLower )
16320 20 69 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a   iLower = iNew;.
16330 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d            nOut--
16340 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77  ;.          pLow
16350 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
16360 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
16370 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c   /* If possible,
16380 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20   improve on the 
16390 69 55 70 70 65 72 20 65 73 74 69 6d 61 74 65 20  iUpper estimate 
163a0 75 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a  using ($P:$U). *
163b0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 55 70 70  /.      if( pUpp
163c0 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  er ){.        in
163d0 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20  t bOk;          
163e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
163f0 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65 78  e if value is ex
16400 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78  tracted from pEx
16410 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  pr */.        Ex
16420 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70  pr *pExpr = pUpp
16430 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
16440 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
16450 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
16460 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
16470 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
16480 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f  r, aff, nEq, &bO
16490 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k);.        if( 
164a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
164b0 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20   bOk ){.        
164c0 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a    tRowcnt iNew;.
164d0 20 20 20 20 20 20 20 20 20 20 69 55 70 72 49 64            iUprId
164e0 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74  x = whereKeyStat
164f0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
16500 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 1, a);.      
16510 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20      iNew = a[0] 
16520 2b 20 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  + ((pUpper->eOpe
16530 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57  rator & (WO_GT|W
16540 4f 5f 4c 45 29 29 20 3f 20 61 5b 31 5d 20 3a 20  O_LE)) ? a[1] : 
16550 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
16560 28 20 69 4e 65 77 3c 69 55 70 70 65 72 20 29 20  ( iNew<iUpper ) 
16570 69 55 70 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20  iUpper = iNew;. 
16580 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b           nOut--;
16590 0a 20 20 20 20 20 20 20 20 20 20 70 55 70 70 65  .          pUppe
165a0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  r = 0;.        }
165b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
165c0 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
165d0 20 70 52 65 63 3b 0a 20 20 20 20 20 20 69 66 28   pRec;.      if(
165e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
165f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 55  {.        if( iU
16600 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20  pper>iLower ){. 
16610 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20           nNew = 
16620 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55  sqlite3LogEst(iU
16630 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a  pper - iLower);.
16640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e            /* TUN
16650 49 4e 47 3a 20 20 49 66 20 62 6f 74 68 20 69 55  ING:  If both iU
16660 70 70 65 72 20 61 6e 64 20 69 4c 6f 77 65 72 20  pper and iLower 
16670 61 72 65 20 64 65 72 69 76 65 64 20 66 72 6f 6d  are derived from
16680 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
16690 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 2c 20 74      ** sample, t
166a0 68 65 6e 20 61 73 73 75 6d 65 20 74 68 65 79 20  hen assume they 
166b0 61 72 65 20 34 78 20 6d 6f 72 65 20 73 65 6c 65  are 4x more sele
166c0 63 74 69 76 65 2e 20 20 54 68 69 73 20 62 72 69  ctive.  This bri
166d0 6e 67 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ngs.          **
166e0 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 73   the estimated s
166f0 65 6c 65 63 74 69 76 69 74 79 20 6d 6f 72 65 20  electivity more 
16700 69 6e 20 6c 69 6e 65 20 77 69 74 68 20 77 68 61  in line with wha
16710 74 20 69 74 20 77 6f 75 6c 64 20 62 65 0a 20 20  t it would be.  
16720 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 65 73          ** if es
16730 74 69 6d 61 74 65 64 20 77 69 74 68 6f 75 74 20  timated without 
16740 74 68 65 20 75 73 65 20 6f 66 20 53 54 41 54 33  the use of STAT3
16750 2f 34 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20  /4 tables. */.  
16760 20 20 20 20 20 20 20 20 69 66 28 20 69 4c 77 72          if( iLwr
16770 49 64 78 3d 3d 69 55 70 72 49 64 78 20 29 20 6e  Idx==iUprIdx ) n
16780 4e 65 77 20 2d 3d 20 32 30 3b 20 20 61 73 73 65  New -= 20;  asse
16790 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 20==sqlite3L
167a0 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20  ogEst(4) );.    
167b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
167c0 20 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20       nNew = 10; 
167d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31         assert( 1
167e0 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
167f0 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  (2) );.        }
16800 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4e 65  .        if( nNe
16810 77 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  w<nOut ){.      
16820 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b      nOut = nNew;
16830 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16840 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
16850 31 30 2c 20 28 22 53 54 41 54 34 20 72 61 6e 67  10, ("STAT4 rang
16860 65 20 73 63 61 6e 3a 20 25 75 2e 2e 25 75 20 20  e scan: %u..%u  
16870 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  est=%d\n",.     
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16890 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65        (u32)iLowe
168a0 72 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20  r, (u32)iUpper, 
168b0 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a  nOut));.      }.
168c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
168d0 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a   int bDone = 0;.
168e0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
168f0 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74  RangeSkipScanEst
16900 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2c  (pParse, pLower,
16910 20 70 55 70 70 65 72 2c 20 70 4c 6f 6f 70 2c 20   pUpper, pLoop, 
16920 26 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69  &bDone);.      i
16930 66 28 20 62 44 6f 6e 65 20 29 20 72 65 74 75 72  f( bDone ) retur
16940 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
16950 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
16960 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29  ARAMETER(pParse)
16970 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
16980 45 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a  ETER(pBuilder);.
16990 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72    assert( pLower
169a0 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 23 65   || pUpper );.#e
169b0 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
169c0 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70  Upper==0 || (pUp
169d0 70 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  per->wtFlags & T
169e0 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b  ERM_VNULL)==0 );
169f0 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52  .  nNew = whereR
16a00 61 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f 77 65  angeAdjust(pLowe
16a10 72 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65 77  r, nOut);.  nNew
16a20 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a   = whereRangeAdj
16a30 75 73 74 28 70 55 70 70 65 72 2c 20 6e 4e 65 77  ust(pUpper, nNew
16a40 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  );..  /* TUNING:
16a50 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
16a60 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c  h an upper and l
16a70 6f 77 65 72 20 6c 69 6d 69 74 20 61 6e 64 20 6e  ower limit and n
16a80 65 69 74 68 65 72 20 6c 69 6d 69 74 0a 20 20 2a  either limit.  *
16a90 2a 20 68 61 73 20 61 6e 20 61 70 70 6c 69 63 61  * has an applica
16aa0 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 6c 69 6b  tion-defined lik
16ab0 65 6c 69 68 6f 6f 64 28 29 2c 20 61 73 73 75 6d  elihood(), assum
16ac0 65 20 74 68 65 20 72 61 6e 67 65 20 69 73 0a 20  e the range is. 
16ad0 20 2a 2a 20 72 65 64 75 63 65 64 20 62 79 20 61   ** reduced by a
16ae0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 37 35 25  n additional 75%
16af0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
16b00 74 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20 61  t, by default, a
16b10 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a 20 20 2a  n open-ended.  *
16b20 2a 20 72 61 6e 67 65 20 71 75 65 72 79 20 28 65  * range query (e
16b30 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20 69 73 20  .g. col > ?) is 
16b40 61 73 73 75 6d 65 64 20 74 6f 20 6d 61 74 63 68  assumed to match
16b50 20 31 2f 34 20 6f 66 20 74 68 65 20 72 6f 77 73   1/4 of the rows
16b60 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   in the.  ** ind
16b70 65 78 2e 20 57 68 69 6c 65 20 61 20 63 6c 6f 73  ex. While a clos
16b80 65 64 20 72 61 6e 67 65 20 28 65 2e 67 2e 20 63  ed range (e.g. c
16b90 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44  ol BETWEEN ? AND
16ba0 20 3f 29 20 69 73 20 65 73 74 69 6d 61 74 65 64   ?) is estimated
16bb0 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 31   to.  ** match 1
16bc0 2f 36 34 20 6f 66 20 74 68 65 20 69 6e 64 65 78  /64 of the index
16bd0 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70 4c 6f 77  . */ .  if( pLow
16be0 65 72 20 26 26 20 70 4c 6f 77 65 72 2d 3e 74 72  er && pLower->tr
16bf0 75 74 68 50 72 6f 62 3e 30 20 26 26 20 70 55 70  uthProb>0 && pUp
16c00 70 65 72 20 26 26 20 70 55 70 70 65 72 2d 3e 74  per && pUpper->t
16c10 72 75 74 68 50 72 6f 62 3e 30 20 29 7b 0a 20 20  ruthProb>0 ){.  
16c20 20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 20 20    nNew -= 20;.  
16c30 7d 0a 0a 20 20 6e 4f 75 74 20 2d 3d 20 28 70 4c  }..  nOut -= (pL
16c40 6f 77 65 72 21 3d 30 29 20 2b 20 28 70 55 70 70  ower!=0) + (pUpp
16c50 65 72 21 3d 30 29 3b 0a 20 20 69 66 28 20 6e 4e  er!=0);.  if( nN
16c60 65 77 3c 31 30 20 29 20 6e 4e 65 77 20 3d 20 31  ew<10 ) nNew = 1
16c70 30 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f  0;.  if( nNew<nO
16c80 75 74 20 29 20 6e 4f 75 74 20 3d 20 6e 4e 65 77  ut ) nOut = nNew
16c90 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48  ;.#if defined(WH
16ca0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
16cb0 29 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e  ).  if( pLoop->n
16cc0 4f 75 74 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20  Out>nOut ){.    
16cd0 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
16ce0 28 22 52 61 6e 67 65 20 73 63 61 6e 20 6c 6f 77  ("Range scan low
16cf0 65 72 73 20 6e 4f 75 74 20 66 72 6f 6d 20 25 64  ers nOut from %d
16d00 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   to %d\n",.     
16d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16d20 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 6e 4f 75 74  Loop->nOut, nOut
16d30 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ));.  }.#endif. 
16d40 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28   pLoop->nOut = (
16d50 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72  LogEst)nOut;.  r
16d60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
16d70 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
16d80 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
16d90 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
16da0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
16db0 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
16dc0 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
16dd0 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79  n.** an equality
16de0 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41   constraint x=VA
16df0 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68  LUE and where th
16e00 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20  at VALUE occurs 
16e10 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67  in.** the histog
16e20 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20  ram data.  This 
16e30 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20  only works when 
16e40 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  x is the left-mo
16e50 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  st.** column of 
16e60 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c  an index and sql
16e70 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67  ite_stat3 histog
16e80 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69  ram data is avai
16e90 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61  lable.** for tha
16ea0 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70  t index.  When p
16eb0 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Expr==NULL that 
16ec0 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72  means the constr
16ed0 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53  aint is.** "x IS
16ee0 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f   NULL" instead o
16ef0 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a  f "x=VALUE"..**.
16f00 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
16f10 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
16f20 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
16f30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16f40 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
16f50 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
16f60 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
16f70 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
16f80 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
16f90 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
16fa0 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
16fb0 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
16fc0 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
16fd0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
16fe0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
16ff0 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
17000 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
17010 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
17020 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
17030 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
17040 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
17050 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
17060 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
17070 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
17080 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
17090 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
170a0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
170b0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
170c0 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
170d0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
170e0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
170f0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
17100 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
17110 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
17120 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20  ssion for VALUE 
17130 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63  in the x=VALUE c
17140 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74  onstraint */.  t
17150 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20  Rowcnt *pnRow   
17160 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
17170 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
17180 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
17190 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42  .  Index *p = pB
171a0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
171b0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
171c0 69 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64  int nEq = pBuild
171d0 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
171e0 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65  e.nEq;.  Unpacke
171f0 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
17200 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
17210 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20    u8 aff;       
17220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
17230 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a  olumn affinity *
17240 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
17250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17260 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74   Subfunction ret
17270 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52  urn code */.  tR
17280 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20  owcnt a[2];     
17290 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69          /* Stati
172a0 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62  stics */.  int b
172b0 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  Ok;..  assert( n
172c0 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  Eq>=1 );.  asser
172d0 74 28 20 6e 45 71 3c 3d 70 2d 3e 6e 43 6f 6c 75  t( nEq<=p->nColu
172e0 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mn );.  assert( 
172f0 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b  p->aSample!=0 );
17300 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53  .  assert( p->nS
17310 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73  ample>0 );.  ass
17320 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e  ert( pBuilder->n
17330 52 65 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a  RecValid<nEq );.
17340 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75 65 73 20  .  /* If values 
17350 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
17360 65 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73  e for all fields
17370 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
17380 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f   the left.  ** o
17390 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65  f this one, no e
173a0 73 74 69 6d 61 74 65 20 63 61 6e 20 62 65 20 6d  stimate can be m
173b0 61 64 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ade. Return SQLI
173c0 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a  TE_NOTFOUND. */.
173d0 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e    if( pBuilder->
173e0 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31  nRecValid<(nEq-1
173f0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
17400 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
17410 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
17420 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
17430 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c  on only. The cal
17440 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 74 61 74  l to sqlite3Stat
17450 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29  4ProbeSetValue()
17460 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c  .  ** below woul
17470 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  d return the sam
17480 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69  e value.  */.  i
17490 66 28 20 6e 45 71 3e 3d 70 2d 3e 6e 43 6f 6c 75  f( nEq>=p->nColu
174a0 6d 6e 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77  mn ){.    *pnRow
174b0 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
174c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
174d0 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62  .  aff = p->pTab
174e0 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f  le->aCol[p->aiCo
174f0 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61 66 66  lumn[nEq-1]].aff
17500 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d 20 73 71  inity;.  rc = sq
17510 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
17520 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
17530 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
17540 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26 62 4f   aff, nEq-1, &bO
17550 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e  k);.  pBuilder->
17560 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69  pRec = pRec;.  i
17570 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17580 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
17590 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74  if( bOk==0 ) ret
175a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
175b0 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d  UND;.  pBuilder-
175c0 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71  >nRecValid = nEq
175d0 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61  ;..  whereKeySta
175e0 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
175f0 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45  ec, 0, a);.  WHE
17600 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 65  RETRACE(0x10,("e
17610 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67  quality scan reg
17620 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e  ions: %d\n", (in
17630 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52  t)a[1]));.  *pnR
17640 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20  ow = a[1];.  .  
17650 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
17660 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
17670 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
17680 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  AT4 */..#ifdef S
17690 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
176a0 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
176b0 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
176c0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
176d0 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
176e0 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
176f0 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  an IN constraint
17700 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74   where the right
17710 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
17720 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
17730 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61   is a list of va
17740 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a  lues.  Example:.
17750 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45  **.**        WHE
17760 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34  RE x IN (1,2,3,4
17770 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ).**.** Write th
17780 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
17790 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
177a0 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
177b0 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
177c0 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
177d0 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
177e0 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
177f0 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
17800 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
17810 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
17820 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
17830 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
17840 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
17850 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
17860 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
17870 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
17880 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
17890 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
178a0 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
178b0 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
178c0 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
178d0 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
178e0 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
178f0 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
17900 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61  c int whereInSca
17910 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
17920 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
17930 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
17940 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
17950 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
17960 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
17970 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  r,.  ExprList *p
17980 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  List,     /* The
17990 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74   value list on t
179a0 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20  he RHS of "x IN 
179b0 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20  (v1,v2,v3,...)" 
179c0 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e  */.  tRowcnt *pn
179d0 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Row       /* Wri
179e0 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
179f0 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
17a00 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
17a10 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
17a20 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
17a30 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f 77 30 20  ex;.  i64 nRow0 
17a40 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54  = sqlite3LogEstT
17a50 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67  oInt(p->aiRowLog
17a60 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e  Est[0]);.  int n
17a70 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c  RecValid = pBuil
17a80 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a  der->nRecValid;.
17a90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17aa0 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62  E_OK;     /* Sub
17ab0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20  function return 
17ac0 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  code */.  tRowcn
17ad0 74 20 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20  t nEst;         
17ae0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
17af0 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ows for a single
17b00 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63   term */.  tRowc
17b10 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20  nt nRowEst = 0; 
17b20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61     /* New estima
17b30 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
17b40 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e   of rows */.  in
17b50 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
17b60 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
17b70 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  unter */..  asse
17b80 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d  rt( p->aSample!=
17b90 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
17ba0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17bb0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
17bc0 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20   i++){.    nEst 
17bd0 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 72 63 20  = nRow0;.    rc 
17be0 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  = whereEqualScan
17bf0 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69  Est(pParse, pBui
17c00 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  lder, pList->a[i
17c10 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b  ].pExpr, &nEst);
17c20 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20  .    nRowEst += 
17c30 6e 45 73 74 3b 0a 20 20 20 20 70 42 75 69 6c 64  nEst;.    pBuild
17c40 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
17c50 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a  nRecValid;.  }..
17c60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17c70 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
17c80 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77 30 20 29  RowEst > nRow0 )
17c90 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52 6f 77 30   nRowEst = nRow0
17ca0 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e  ;.    *pnRow = n
17cb0 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48 45 52  RowEst;.    WHER
17cc0 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 49 4e  ETRACE(0x10,("IN
17cd0 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a 20 65   row estimate: e
17ce0 73 74 3d 25 64 5c 6e 22 2c 20 6e 52 6f 77 45 73  st=%d\n", nRowEs
17cf0 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  t));.  }.  asser
17d00 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  t( pBuilder->nRe
17d10 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69  cValid==nRecVali
17d20 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  d );.  return rc
17d30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
17d40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
17d50 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
17d60 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74  *.** Disable a t
17d70 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
17d80 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74   clause.  Except
17d90 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65  , do not disable
17da0 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20   the term.** if 
17db0 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45  it controls a LE
17dc0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e  FT OUTER JOIN an
17dd0 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69  d it did not ori
17de0 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e  ginate in the ON
17df0 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61  .** or USING cla
17e00 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e  use of that join
17e10 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72  ..**.** Consider
17e20 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27   the term t2.z='
17e30 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ok' in the follo
17e40 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a  wing queries:.**
17e50 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43  .**   (1)  SELEC
17e60 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
17e70 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
17e80 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a  =t2.x WHERE t2.z
17e90 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20  ='ok'.**   (2)  
17ea0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
17eb0 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
17ec0 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74   t1.a=t2.x AND t
17ed0 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33  2.z='ok'.**   (3
17ee0 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
17ef0 20 74 31 2c 20 74 32 20 57 48 45 52 45 20 74 31   t1, t2 WHERE t1
17f00 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a  .a=t2.x AND t2.z
17f10 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ='ok'.**.** The 
17f20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73  t2.z='ok' is dis
17f30 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20  abled in the in 
17f40 28 32 29 20 62 65 63 61 75 73 65 20 69 74 20 6f  (2) because it o
17f50 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20  riginates.** in 
17f60 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20  the ON clause.  
17f70 54 68 65 20 74 65 72 6d 20 69 73 20 64 69 73 61  The term is disa
17f80 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63 61  bled in (3) beca
17f90 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61  use it is not pa
17fa0 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20  rt.** of a LEFT 
17fb0 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20  OUTER JOIN.  In 
17fc0 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73  (1), the term is
17fd0 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a   not disabled..*
17fe0 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61  *.** Disabling a
17ff0 20 74 65 72 6d 20 63 61 75 73 65 73 20 74 68 61   term causes tha
18000 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65  t term to not be
18010 20 74 65 73 74 65 64 20 69 6e 20 74 68 65 20 69   tested in the i
18020 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
18030 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62  the join.  Disab
18040 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d  ling is an optim
18050 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74  ization.  When t
18060 65 72 6d 73 20 61 72 65 20 73 61 74 69 73 66 69  erms are satisfi
18070 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73  ed.** by indices
18080 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74 68 65  , we disable the
18090 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64  m to prevent red
180a0 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20  undant tests in 
180b0 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f  the inner.** loo
180c0 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74  p.  We would get
180d0 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73   the correct res
180e0 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20  ults if nothing 
180f0 77 65 72 65 20 65 76 65 72 20 64 69 73 61 62 6c  were ever disabl
18100 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73  ed,.** but joins
18110 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74   might run a lit
18120 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65  tle slower.  The
18130 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73   trick is to dis
18140 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20  able as much.** 
18150 61 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75  as we can withou
18160 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20  t disabling too 
18170 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64 69 73  much.  If we dis
18180 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65  abled in (1), we
18190 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72  'd get.** the wr
181a0 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65  ong answer.  See
181b0 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2a   ticket #813..**
181c0 0a 2a 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 63  .** If all the c
181d0 68 69 6c 64 72 65 6e 20 6f 66 20 61 20 74 65 72  hildren of a ter
181e0 6d 20 61 72 65 20 64 69 73 61 62 6c 65 64 2c 20  m are disabled, 
181f0 74 68 65 6e 20 74 68 61 74 20 74 65 72 6d 20 69  then that term i
18200 73 20 61 6c 73 6f 0a 2a 2a 20 61 75 74 6f 6d 61  s also.** automa
18210 74 69 63 61 6c 6c 79 20 64 69 73 61 62 6c 65 64  tically disabled
18220 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
18230 74 65 72 6d 73 20 67 65 74 20 64 69 73 61 62 6c  terms get disabl
18240 65 64 20 69 66 20 64 65 72 69 76 65 64 0a 2a 2a  ed if derived.**
18250 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61   virtual terms a
18260 72 65 20 74 65 73 74 65 64 20 66 69 72 73 74 2e  re tested first.
18270 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a    For example:.*
18280 2a 0a 2a 2a 20 20 20 20 20 20 78 20 47 4c 4f 42  *.**      x GLOB
18290 20 27 61 62 63 2a 27 20 41 4e 44 20 78 3e 3d 27   'abc*' AND x>='
182a0 61 62 63 27 20 41 4e 44 20 78 3c 27 61 63 64 27  abc' AND x<'acd'
182b0 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  .**      \______
182c0 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
182d0 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 2f 0a  __/     \_____/.
182e0 2a 2a 20 20 20 20 20 20 20 20 20 70 61 72 65 6e  **         paren
182f0 74 20 20 20 20 20 20 20 20 20 20 63 68 69 6c 64  t          child
18300 31 20 20 20 20 20 20 20 63 68 69 6c 64 32 0a 2a  1       child2.*
18310 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 70 61  *.** Only the pa
18320 72 65 6e 74 20 74 65 72 6d 20 77 61 73 20 69 6e  rent term was in
18330 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48   the original WH
18340 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ERE clause.  The
18350 20 63 68 69 6c 64 31 0a 2a 2a 20 61 6e 64 20 63   child1.** and c
18360 68 69 6c 64 32 20 74 65 72 6d 73 20 77 65 72 65  hild2 terms were
18370 20 61 64 64 65 64 20 62 79 20 74 68 65 20 4c 49   added by the LI
18380 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  KE optimization.
18390 20 20 49 66 20 62 6f 74 68 20 6f 66 0a 2a 2a 20    If both of.** 
183a0 74 68 65 20 76 69 72 74 75 61 6c 20 63 68 69 6c  the virtual chil
183b0 64 20 74 65 72 6d 73 20 61 72 65 20 76 61 6c 69  d terms are vali
183c0 64 2c 20 74 68 65 6e 20 74 65 73 74 69 6e 67 20  d, then testing 
183d0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 63 61  of the parent ca
183e0 6e 20 62 65 20 0a 2a 2a 20 73 6b 69 70 70 65 64  n be .** skipped
183f0 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 20  ..**.** Usually 
18400 74 68 65 20 70 61 72 65 6e 74 20 74 65 72 6d 20  the parent term 
18410 69 73 20 6d 61 72 6b 65 64 20 61 73 20 54 45 52  is marked as TER
18420 4d 5f 43 4f 44 45 44 2e 20 20 42 75 74 20 69 66  M_CODED.  But if
18430 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 74   the parent.** t
18440 65 72 6d 20 77 61 73 20 6f 72 69 67 69 6e 61 6c  erm was original
18450 6c 79 20 54 45 52 4d 5f 4c 49 4b 45 2c 20 74 68  ly TERM_LIKE, th
18460 65 6e 20 74 68 65 20 70 61 72 65 6e 74 20 67 65  en the parent ge
18470 74 73 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44  ts TERM_LIKECOND
18480 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 20 54 68 65   instead..** The
18490 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44 20 6d   TERM_LIKECOND m
184a0 61 72 6b 69 6e 67 20 69 6e 64 69 63 61 74 65 73  arking indicates
184b0 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 20 73   that the term s
184c0 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 69  hould be coded i
184d0 6e 73 69 64 65 0a 2a 2a 20 61 20 63 6f 6e 64 69  nside.** a condi
184e0 74 69 6f 6e 61 6c 20 73 75 63 68 20 74 68 61 74  tional such that
184f0 20 69 73 20 6f 6e 6c 79 20 65 76 61 6c 75 61 74   is only evaluat
18500 65 64 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  ed on the second
18510 20 70 61 73 73 20 6f 66 20 61 0a 2a 2a 20 4c 49   pass of a.** LI
18520 4b 45 2d 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  KE-optimization 
18530 6c 6f 6f 70 2c 20 77 68 65 6e 20 73 63 61 6e 6e  loop, when scann
18540 69 6e 67 20 42 4c 4f 42 73 20 69 6e 73 74 65 61  ing BLOBs instea
18550 64 20 6f 66 20 73 74 72 69 6e 67 73 2e 0a 2a 2f  d of strings..*/
18560 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
18570 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65  ableTerm(WhereLe
18580 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65  vel *pLevel, Whe
18590 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a  reTerm *pTerm){.
185a0 20 20 69 6e 74 20 6e 4c 6f 6f 70 20 3d 20 30 3b    int nLoop = 0;
185b0 0a 20 20 77 68 69 6c 65 28 20 70 54 65 72 6d 0a  .  while( pTerm.
185c0 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
185d0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
185e0 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  CODED)==0.      
185f0 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  && (pLevel->iLef
18600 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72  tJoin==0 || Expr
18610 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
18620 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
18630 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 26 26  mJoin)).      &&
18640 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61   (pLevel->notRea
18650 64 79 20 26 20 70 54 65 72 6d 2d 3e 70 72 65 72  dy & pTerm->prer
18660 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20  eqAll)==0.  ){. 
18670 20 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20     if( nLoop && 
18680 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
18690 26 20 54 45 52 4d 5f 4c 49 4b 45 29 21 3d 30 20  & TERM_LIKE)!=0 
186a0 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
186b0 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
186c0 4c 49 4b 45 43 4f 4e 44 3b 0a 20 20 20 20 7d 65  LIKECOND;.    }e
186d0 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
186e0 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
186f0 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
18700 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50     if( pTerm->iP
18710 61 72 65 6e 74 3c 30 20 29 20 62 72 65 61 6b 3b  arent<0 ) break;
18720 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 54  .    pTerm = &pT
18730 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
18740 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
18750 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 2d 2d   pTerm->nChild--
18760 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
18770 3e 6e 43 68 69 6c 64 21 3d 30 20 29 20 62 72 65  >nChild!=0 ) bre
18780 61 6b 3b 0a 20 20 20 20 6e 4c 6f 6f 70 2b 2b 3b  ak;.    nLoop++;
18790 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
187a0 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74  de an OP_Affinit
187b0 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c  y opcode to appl
187c0 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  y the column aff
187d0 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66  inity string zAf
187e0 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65  f.** to the n re
187f0 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
18800 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a   at base. .**.**
18810 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   As an optimizat
18820 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  ion, SQLITE_AFF_
18830 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68  NONE entries (wh
18840 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20  ich are no-ops) 
18850 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e  at the.** beginn
18860 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a  ing and end of z
18870 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  Aff are ignored.
18880 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73    If all entries
18890 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20   in zAff are.** 
188a0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c  SQLITE_AFF_NONE,
188b0 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65   then no code ge
188c0 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a  ts generated..**
188d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
188e0 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63   makes its own c
188f0 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74  opy of zAff so t
18900 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69  hat the caller i
18910 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64  s free.** to mod
18920 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74  ify zAff after t
18930 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
18940 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rns..*/.static v
18950 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66  oid codeApplyAff
18960 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61  inity(Parse *pPa
18970 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69  rse, int base, i
18980 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66  nt n, char *zAff
18990 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
189a0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
189b0 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20  if( zAff==0 ){. 
189c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
189d0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
189e0 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
189f0 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
18a00 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41   v!=0 );..  /* A
18a10 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e  djust base and n
18a20 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51   to skip over SQ
18a30 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e  LITE_AFF_NONE en
18a40 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67  tries at the beg
18a50 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20  inning.  ** and 
18a60 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e  end of the affin
18a70 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f  ity string..  */
18a80 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
18a90 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45   zAff[0]==SQLITE
18aa0 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
18ab0 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b   n--;.    base++
18ac0 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20  ;.    zAff++;.  
18ad0 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  }.  while( n>1 &
18ae0 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c  & zAff[n-1]==SQL
18af0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
18b00 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20      n--;.  }..  
18b10 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41  /* Code the OP_A
18b20 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69  ffinity opcode i
18b30 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68  f there is anyth
18b40 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20  ing left to do. 
18b50 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  */.  if( n>0 ){.
18b60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18b70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp2(v, OP_Affi
18b80 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  nity, base, n);.
18b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
18ba0 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a  hangeP4(v, -1, z
18bb0 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c  Aff, n);.    sql
18bc0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
18bd0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
18be0 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  se, base, n);.  
18bf0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
18c00 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
18c10 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20  single equality 
18c20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
18c30 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71  E clause.  An eq
18c40 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63  uality.** term c
18c50 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65  an be either X=e
18c60 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e  xpr or X IN (...
18c70 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68  ).   pTerm is th
18c80 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a  e term to be .**
18c90 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   coded..**.** Th
18ca0 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
18cb0 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69  for the constrai
18cc0 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  nt is left in re
18cd0 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a  gister iReg..**.
18ce0 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61  ** For a constra
18cf0 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  int of the form 
18d00 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72  X=expr, the expr
18d10 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61  ession is evalua
18d20 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72  ted and its.** r
18d30 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e  esult is left on
18d40 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72   the stack.  For
18d50 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20   constraints of 
18d60 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e  the form X IN (.
18d70 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ..).** this rout
18d80 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f  ine sets up a lo
18d90 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65  op that will ite
18da0 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61  rate over all va
18db0 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74  lues of X..*/.st
18dc0 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75  atic int codeEqu
18dd0 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72  alityTerm(.  Par
18de0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
18df0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
18e00 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
18e10 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
18e20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20   /* The term of 
18e30 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
18e40 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
18e50 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
18e60 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76  evel, /* The lev
18e70 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  el of the FROM c
18e80 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72  lause we are wor
18e90 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74  king on */.  int
18ea0 20 69 45 71 2c 20 20 20 20 20 20 20 20 20 20 20   iEq,           
18eb0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
18ec0 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77   equality term w
18ed0 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c  ithin this level
18ee0 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20   */.  int bRev, 
18ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
18f00 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72  e for reverse-or
18f10 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e  der IN operation
18f20 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67  s */.  int iTarg
18f30 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74  et         /* At
18f40 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72  tempt to leave r
18f50 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72  esults in this r
18f60 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
18f70 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
18f80 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20  ->pExpr;.  Vdbe 
18f90 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
18fa0 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20  be;.  int iReg; 
18fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fc0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
18fd0 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ding results */.
18fe0 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67  .  assert( iTarg
18ff0 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58  et>0 );.  if( pX
19000 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70  ->op==TK_EQ || p
19010 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 7b 0a  X->op==TK_IS ){.
19020 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
19030 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
19040 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
19050 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ght, iTarget);. 
19060 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f   }else if( pX->o
19070 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
19080 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
19090 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  et;.    sqlite3V
190a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
190b0 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a  Null, 0, iReg);.
190c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
190d0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d  MIT_SUBQUERY.  }
190e0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54  else{.    int eT
190f0 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61  ype;.    int iTa
19100 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e  b;.    struct In
19110 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57  Loop *pIn;.    W
19120 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
19130 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
19140 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  ;..    if( (pLoo
19150 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
19160 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
19170 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f  ==0.      && pLo
19180 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
19190 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70  ex!=0.      && p
191a0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
191b0 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
191c0 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20  [iEq].    ){.   
191d0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 45 71     testcase( iEq
191e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
191f0 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20  tcase( bRev );. 
19200 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65       bRev = !bRe
19210 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  v;.    }.    ass
19220 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
19230 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d  IN );.    iReg =
19240 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54   iTarget;.    eT
19250 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
19260 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
19270 20 70 58 2c 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f   pX, IN_INDEX_LO
19280 4f 50 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  OP, 0);.    if( 
19290 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
192a0 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20  INDEX_DESC ){.  
192b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52      testcase( bR
192c0 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76  ev );.      bRev
192d0 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a   = !bRev;.    }.
192e0 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69      iTab = pX->i
192f0 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  Table;.    sqlit
19300 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19310 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a  bRev ? OP_Last :
19320 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
19330 2c 20 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  , 0);.    VdbeCo
19340 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
19350 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
19360 61 67 65 49 66 28 76 2c 20 21 62 52 65 76 29 3b  ageIf(v, !bRev);
19370 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c  .    assert( (pL
19380 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
19390 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d  HERE_MULTI_OR)==
193a0 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 );.    pLoop->
193b0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
193c0 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20 69 66  _IN_ABLE;.    if
193d0 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  ( pLevel->u.in.n
193e0 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  In==0 ){.      p
193f0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d  Level->addrNxt =
19400 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19410 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a  Label(v);.    }.
19420 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
19430 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76  .nIn++;.    pLev
19440 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
19450 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65   =.       sqlite
19460 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
19470 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65  (pParse->db, pLe
19480 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
19490 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
194a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194b0 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e   sizeof(pLevel->
194c0 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29  u.in.aInLoop[0])
194d0 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49  *pLevel->u.in.nI
194e0 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c  n);.    pIn = pL
194f0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
19500 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20  op;.    if( pIn 
19510 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20  ){.      pIn += 
19520 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
19530 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d   - 1;.      pIn-
19540 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20  >iCur = iTab;.  
19550 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49      if( eType==I
19560 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b  N_INDEX_ROWID ){
19570 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64  .        pIn->ad
19580 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65  drInTop = sqlite
19590 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
195a0 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69  P_Rowid, iTab, i
195b0 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
195c0 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  e{.        pIn->
195d0 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69  addrInTop = sqli
195e0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
195f0 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
19600 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  , 0, iReg);.    
19610 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d 3e 65    }.      pIn->e
19620 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76  EndLoopOp = bRev
19630 20 3f 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e   ? OP_PrevIfOpen
19640 20 3a 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e   : OP_NextIfOpen
19650 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19660 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
19670 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 20 56  IsNull, iReg); V
19680 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19690 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
196a0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
196b0 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e  n = 0;.    }.#en
196c0 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c  dif.  }.  disabl
196d0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
196e0 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  erm);.  return i
196f0 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Reg;.}../*.** Ge
19700 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
19710 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61   will evaluate a
19720 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e  ll == and IN con
19730 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a  straints for an.
19740 2a 2a 20 69 6e 64 65 78 20 73 63 61 6e 2e 0a 2a  ** index scan..*
19750 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
19760 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65  , consider table
19770 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29   t1(a,b,c,d,e,f)
19780 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61   with index i1(a
19790 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73  ,b,c)..** Suppos
197a0 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
197b0 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d  se is this:  a==
197c0 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c  5 AND b IN (1,2,
197d0 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63  3) AND c>5 AND c
197e0 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  <10.** The index
197f0 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20   has as many as 
19800 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63  three equality c
19810 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20  onstraints, but 
19820 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70  in this.** examp
19830 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63  le, the third "c
19840 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e  " value is an in
19850 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e  equality.  So on
19860 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74  ly two .** const
19870 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64  raints are coded
19880 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
19890 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f  will generate co
198a0 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a  de to evaluate.*
198b0 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20  * a==5 and b IN 
198c0 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75  (1,2,3).  The cu
198d0 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72  rrent values for
198e0 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65   a and b will be
198f0 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f   stored.** in co
19900 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74  nsecutive regist
19910 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ers and the inde
19920 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  x of the first r
19930 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72  egister is retur
19940 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ned..**.** In th
19950 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20  e example above 
19960 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69  nEq==2.  But thi
19970 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72  s subroutine wor
19980 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65  ks for any value
19990 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75  .** of nEq inclu
199a0 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d  ding 0.  If nEq=
199b0 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  =0, this routine
199c0 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d   is nearly a no-
199d0 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  op..** The only 
199e0 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73  thing it does is
199f0 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c   allocate the pL
19a00 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72  evel->iMem memor
19a10 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f  y cell and.** co
19a20 6d 70 75 74 65 20 74 68 65 20 61 66 66 69 6e 69  mpute the affini
19a30 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ty string..**.**
19a40 20 54 68 65 20 6e 45 78 74 72 61 52 65 67 20 70   The nExtraReg p
19a50 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 6f 72  arameter is 0 or
19a60 20 31 2e 20 20 49 74 20 69 73 20 30 20 69 66 20   1.  It is 0 if 
19a70 61 6c 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  all WHERE clause
19a80 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
19a90 61 72 65 20 3d 3d 20 6f 72 20 49 4e 20 61 6e 64  are == or IN and
19aa0 20 61 72 65 20 63 6f 76 65 72 65 64 20 62 79 20   are covered by 
19ab0 74 68 65 20 6e 45 71 2e 20 20 6e 45 78 74 72 61  the nEq.  nExtra
19ac0 52 65 67 20 69 73 20 31 20 69 66 20 74 68 65 72  Reg is 1 if ther
19ad0 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 65 71 75  e is.** an inequ
19ae0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
19af0 20 28 73 75 63 68 20 61 73 20 74 68 65 20 22 63   (such as the "c
19b00 3e 3d 35 20 41 4e 44 20 63 3c 31 30 22 20 69 6e  >=5 AND c<10" in
19b10 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20 74 68   the example) th
19b20 61 74 0a 2a 2a 20 6f 63 63 75 72 73 20 61 66 74  at.** occurs aft
19b30 65 72 20 74 68 65 20 6e 45 71 20 71 75 61 6c 69  er the nEq quali
19b40 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ty constraints..
19b50 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
19b60 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 72  ne allocates a r
19b70 61 6e 67 65 20 6f 66 20 6e 45 71 2b 6e 45 78 74  ange of nEq+nExt
19b80 72 61 52 65 67 20 6d 65 6d 6f 72 79 20 63 65 6c  raReg memory cel
19b90 6c 73 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a  ls and returns.*
19ba0 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  * the index of t
19bb0 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72 79 20  he first memory 
19bc0 63 65 6c 6c 20 69 6e 20 74 68 61 74 20 72 61 6e  cell in that ran
19bd0 67 65 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61  ge. The code tha
19be0 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20  t.** calls this 
19bf0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65  routine will use
19c00 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 72 61 6e   that memory ran
19c10 67 65 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 73  ge to store keys
19c20 20 66 6f 72 0a 2a 2a 20 73 74 61 72 74 20 61 6e   for.** start an
19c30 64 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  d termination co
19c40 6e 64 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  nditions of the 
19c50 6c 6f 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76 61 6c  loop..** key val
19c60 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ue of the loop. 
19c70 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   If one or more 
19c80 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70  IN operators app
19c90 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ear, then.** thi
19ca0 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  s routine alloca
19cb0 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61  tes an additiona
19cc0 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c  l nEq memory cel
19cd0 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a  ls for internal.
19ce0 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65  ** use..**.** Be
19cf0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
19d00 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f  *pzAff is set to
19d10 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
19d20 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a  er containing a.
19d30 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  ** copy of the c
19d40 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73  olumn affinity s
19d50 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64  tring of the ind
19d60 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  ex allocated usi
19d70 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d  ng.** sqlite3DbM
19d80 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c  alloc(). Except,
19d90 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
19da0 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72 69  copy of the stri
19db0 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ng associated.**
19dc0 20 77 69 74 68 20 65 71 75 61 6c 69 74 79 20 63   with equality c
19dd0 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20  onstraints that 
19de0 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74  use NONE affinit
19df0 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20  y are set to.** 
19e00 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
19e10 20 54 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c   This is to deal
19e20 20 77 69 74 68 20 53 51 4c 20 73 75 63 68 20 61   with SQL such a
19e30 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
19e40 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
19e50 54 41 42 4c 45 20 74 31 28 61 20 54 45 58 54 20  TABLE t1(a TEXT 
19e60 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
19e70 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e  .**   SELECT ...
19e80 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20   FROM t1 AS t2, 
19e90 74 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20  t1 WHERE t1.a = 
19ea0 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  t2.b;.**.** In t
19eb0 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
19ec0 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74  , the index on t
19ed0 31 28 61 29 20 68 61 73 20 54 45 58 54 20 61 66  1(a) has TEXT af
19ee0 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63  finity. But sinc
19ef0 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68  e.** the right h
19f00 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
19f10 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
19f20 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e  int (t2.b) has N
19f30 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a  ONE affinity,.**
19f40 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73   no conversion s
19f50 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74  hould be attempt
19f60 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20  ed before using 
19f70 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20  a t2.b value as 
19f80 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79  part of.** a key
19f90 20 74 6f 20 73 65 61 72 63 68 20 74 68 65 20 69   to search the i
19fa0 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20  ndex. Hence the 
19fb0 66 69 72 73 74 20 62 79 74 65 20 69 6e 20 74 68  first byte in th
19fc0 65 20 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e  e returned affin
19fd0 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e  ity.** string in
19fe0 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f   this example wo
19ff0 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53 51  uld be set to SQ
1a000 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a  LITE_AFF_NONE..*
1a010 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
1a020 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
1a030 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
1a040 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
1a050 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1a060 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
1a070 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63  Level,   /* Whic
1a080 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  h nested loop of
1a090 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65   the FROM we are
1a0a0 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74   coding */.  int
1a0b0 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20   bRev,          
1a0c0 20 20 20 2f 2a 20 52 65 76 65 72 73 65 20 74 68     /* Reverse th
1a0d0 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f 70  e order of IN op
1a0e0 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74  erators */.  int
1a0f0 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20 20   nExtraReg,     
1a100 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a110 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
1a120 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
1a130 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20   char **pzAff   
1a140 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
1a150 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
1a160 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
1a170 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 45 71 3b 20  /.){.  u16 nEq; 
1a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a190 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
1a1a0 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63  er of == or IN c
1a1b0 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f  onstraints to co
1a1c0 64 65 20 2a 2f 0a 20 20 75 31 36 20 6e 53 6b 69  de */.  u16 nSki
1a1d0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1a1e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1a1f0 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  of left-most col
1a200 75 6d 6e 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a  umns to skip */.
1a210 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1a220 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
1a230 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20  /* The vm under 
1a240 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1a250 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a270 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69  /* The index bei
1a280 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73  ng used for this
1a290 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65   loop */.  Where
1a2a0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
1a2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
1a2c0 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ngle constraint 
1a2d0 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  term */.  WhereL
1a2e0 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
1a2f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1a300 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
1a310 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
1a320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a330 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1a340 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  er */.  int regB
1a350 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1a360 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65        /* Base re
1a370 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
1a380 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nReg;           
1a390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a3a0 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73  ber of registers
1a3b0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
1a3c0 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20    char *zAff;   
1a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3e0 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69  /* Affinity stri
1a3f0 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ng to return */.
1a400 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c  .  /* This modul
1a410 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
1a420 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20   on query plans 
1a430 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65  that use an inde
1a440 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20  x. */.  pLoop = 
1a450 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
1a460 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
1a470 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1a480 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
1a490 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c  =0 );.  nEq = pL
1a4a0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1a4b0 3b 0a 20 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f  ;.  nSkip = pLoo
1a4c0 70 2d 3e 6e 53 6b 69 70 3b 0a 20 20 70 49 64 78  p->nSkip;.  pIdx
1a4d0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
1a4e0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61 73 73 65  e.pIndex;.  asse
1a4f0 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 0a  rt( pIdx!=0 );..
1a500 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
1a510 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20  how many memory 
1a520 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65  cells we will ne
1a530 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  ed then allocate
1a540 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65   them..  */.  re
1a550 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e  gBase = pParse->
1a560 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67  nMem + 1;.  nReg
1a570 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
1a580 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65  e.nEq + nExtraRe
1a590 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  g;.  pParse->nMe
1a5a0 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41  m += nReg;..  zA
1a5b0 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ff = sqlite3DbSt
1a5c0 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
1a5d0 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
1a5e0 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64 78  inityStr(v, pIdx
1a5f0 29 29 3b 0a 20 20 69 66 28 20 21 7a 41 66 66 20  ));.  if( !zAff 
1a600 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64  ){.    pParse->d
1a610 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a620 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  = 1;.  }..  if( 
1a630 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 69 6e 74  nSkip ){.    int
1a640 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65   iIdxCur = pLeve
1a650 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
1a660 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a670 31 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f 4c 61  1(v, (bRev?OP_La
1a680 73 74 3a 4f 50 5f 52 65 77 69 6e 64 29 2c 20 69  st:OP_Rewind), i
1a690 49 64 78 43 75 72 29 3b 0a 20 20 20 20 56 64 62  IdxCur);.    Vdb
1a6a0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
1a6b0 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62  Rev==0);.    Vdb
1a6c0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
1a6d0 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 56 64 62  Rev!=0);.    Vdb
1a6e0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  eComment((v, "be
1a6f0 67 69 6e 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e  gin skip-scan on
1a700 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d   %s", pIdx->zNam
1a710 65 29 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c  e));.    j = sql
1a720 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
1a730 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
1a740 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
1a750 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1a760 64 4f 70 34 49 6e 74 28 76 2c 20 28 62 52 65 76  dOp4Int(v, (bRev
1a770 3f 4f 50 5f 53 65 65 6b 4c 54 3a 4f 50 5f 53 65  ?OP_SeekLT:OP_Se
1a780 65 6b 47 54 29 2c 0a 20 20 20 20 20 20 20 20 20  ekGT),.         
1a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7a0 20 20 20 69 49 64 78 43 75 72 2c 20 30 2c 20 72     iIdxCur, 0, r
1a7b0 65 67 42 61 73 65 2c 20 6e 53 6b 69 70 29 3b 0a  egBase, nSkip);.
1a7c0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a7d0 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a  If(v, bRev==0);.
1a7e0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a7f0 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a  If(v, bRev!=0);.
1a800 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1a810 75 6d 70 48 65 72 65 28 76 2c 20 6a 29 3b 0a 20  umpHere(v, j);. 
1a820 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53     for(j=0; j<nS
1a830 6b 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  kip; j++){.     
1a840 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a850 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1a860 20 69 49 64 78 43 75 72 2c 20 6a 2c 20 72 65 67   iIdxCur, j, reg
1a870 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 61  Base+j);.      a
1a880 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43  ssert( pIdx->aiC
1a890 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20  olumn[j]>=0 );. 
1a8a0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1a8b0 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d  ((v, "%s", pIdx-
1a8c0 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 49  >pTable->aCol[pI
1a8d0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  dx->aiColumn[j]]
1a8e0 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  .zName));.    }.
1a8f0 20 20 7d 20 20 20 20 0a 0a 20 20 2f 2a 20 45 76    }    ..  /* Ev
1a900 61 6c 75 61 74 65 20 74 68 65 20 65 71 75 61 6c  aluate the equal
1a910 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  ity constraints.
1a920 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a    */.  assert( z
1a930 41 66 66 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 73  Aff==0 || (int)s
1a940 74 72 6c 65 6e 28 7a 41 66 66 29 3e 3d 6e 45 71  trlen(zAff)>=nEq
1a950 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 6e 53 6b 69   );.  for(j=nSki
1a960 70 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a  p; j<nEq; j++){.
1a970 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
1a980 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61  pTerm = pLoop->a
1a990 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73  LTerm[j];.    as
1a9a0 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
1a9b0 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ;.    /* The fol
1a9c0 6c 6f 77 69 6e 67 20 74 65 73 74 63 61 73 65 20  lowing testcase 
1a9d0 69 73 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69  is true for indi
1a9e0 63 65 73 20 77 69 74 68 20 72 65 64 75 6e 64 61  ces with redunda
1a9f0 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20  nt columns. .   
1aa00 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49   ** Ex: CREATE I
1aa10 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c  NDEX i1 ON t1(a,
1aa20 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46  b,a); SELECT * F
1aa30 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30  ROM t1 WHERE a=0
1aa40 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20   AND b=0; */.   
1aa50 20 74 65 73 74 63 61 73 65 28 20 28 70 54 65 72   testcase( (pTer
1aa60 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
1aa70 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20  M_CODED)!=0 );. 
1aa80 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1aa90 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1aaa0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1aab0 20 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c    r1 = codeEqual
1aac0 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
1aad0 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a  pTerm, pLevel, j
1aae0 2c 20 62 52 65 76 2c 20 72 65 67 42 61 73 65 2b  , bRev, regBase+
1aaf0 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d  j);.    if( r1!=
1ab00 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20  regBase+j ){.   
1ab10 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29     if( nReg==1 )
1ab20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ab30 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1ab40 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 29  pParse, regBase)
1ab50 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  ;.        regBas
1ab60 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65  e = r1;.      }e
1ab70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1ab80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ab90 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20  , OP_SCopy, r1, 
1aba0 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
1abb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
1abc0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
1abd0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
1abe0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
1abf0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
1ac00 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
1ac10 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
1ac20 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1ac30 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29  O_ISNULL|WO_IN))
1ac40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  ==0 ){.      Exp
1ac50 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72  r *pRight = pTer
1ac60 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
1ac70 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
1ac80 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
1ac90 28 70 52 69 67 68 74 29 20 26 26 20 70 54 65 72  (pRight) && pTer
1aca0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f  m->eOperator!=WO
1acb0 5f 49 53 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _IS ){.        s
1acc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1acd0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
1ace0 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c  egBase+j, pLevel
1acf0 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
1ad00 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1ad10 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
1ad20 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20     if( zAff ){. 
1ad30 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1ad40 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
1ad50 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a  y(pRight, zAff[j
1ad60 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ])==SQLITE_AFF_N
1ad70 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
1ad80 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
1ad90 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1ada0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1adb0 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
1adc0 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
1add0 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b  ge(pRight, zAff[
1ade0 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j]) ){.         
1adf0 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
1ae00 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1ae10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1ae20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66    }.  }.  *pzAff
1ae30 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72   = zAff;.  retur
1ae40 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69  n regBase;.}..#i
1ae50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ae60 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
1ae70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1ae80 61 20 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70  a helper for exp
1ae90 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29  lainIndexRange()
1aea0 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74   below.**.** pSt
1aeb0 72 20 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74  r holds the text
1aec0 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
1aed0 6e 20 74 68 61 74 20 77 65 20 61 72 65 20 62 75  n that we are bu
1aee0 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65  ilding up one te
1aef0 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e  rm.** at a time.
1af00 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
1af10 64 64 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74  dds a new term t
1af20 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1af30 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
1af40 54 65 72 6d 73 20 61 72 65 20 73 65 70 61 72 61  Terms are separa
1af50 74 65 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64  ted by AND so ad
1af60 64 20 74 68 65 20 22 41 4e 44 22 20 74 65 78 74  d the "AND" text
1af70 20 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20   for second and 
1af80 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65  subsequent.** te
1af90 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  rms only..*/.sta
1afa0 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
1afb0 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74  AppendTerm(.  St
1afc0 72 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20  rAccum *pStr,   
1afd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1afe0 20 74 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e   text expression
1aff0 20 62 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a   being built */.
1b000 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20    int iTerm,    
1b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b020 20 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74   Index of this t
1b030 65 72 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a  erm.  First is z
1b040 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ero */.  const c
1b050 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20  har *zColumn,   
1b060 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b070 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  the column */.  
1b080 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
1b090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b0a0 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  ame of the opera
1b0b0 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  tor */.){.  if( 
1b0c0 69 54 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53  iTerm ) sqlite3S
1b0d0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
1b0e0 74 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b  tr, " AND ", 5);
1b0f0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
1b100 75 6d 41 70 70 65 6e 64 41 6c 6c 28 70 53 74 72  umAppendAll(pStr
1b110 2c 20 7a 43 6f 6c 75 6d 6e 29 3b 0a 20 20 73 71  , zColumn);.  sq
1b120 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
1b130 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31  end(pStr, zOp, 1
1b140 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
1b150 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
1b160 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a   "?", 1);.}../*.
1b170 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76  ** Argument pLev
1b180 65 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73  el describes a s
1b190 74 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e  trategy for scan
1b1a0 6e 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e  ning table pTab.
1b1b0 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
1b1c0 6f 6e 20 61 70 70 65 6e 64 73 20 74 65 78 74 20  on appends text 
1b1d0 74 6f 20 70 53 74 72 20 74 68 61 74 20 64 65 73  to pStr that des
1b1e0 63 72 69 62 65 73 20 74 68 65 20 73 75 62 73 65  cribes the subse
1b1f0 74 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 72 6f  t of table.** ro
1b200 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68  ws scanned by th
1b210 65 20 73 74 72 61 74 65 67 79 20 69 6e 20 74 68  e strategy in th
1b220 65 20 66 6f 72 6d 20 6f 66 20 61 6e 20 53 51 4c  e form of an SQL
1b230 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
1b240 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1b250 69 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a  if the query:.**
1b260 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
1b270 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31  ROM t1 WHERE a=1
1b280 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20   AND b>2;.**.** 
1b290 69 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65  is run and there
1b2a0 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
1b2b0 28 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69  (a, b), then thi
1b2c0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1b2d0 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73  ns a.** string s
1b2e0 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a  imilar to:.**.**
1b2f0 20 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22     "a=? AND b>?"
1b300 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b310 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
1b320 65 28 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72  e(StrAccum *pStr
1b330 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f  , WhereLoop *pLo
1b340 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  op, Table *pTab)
1b350 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
1b360 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
1b370 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 75 31 36  ee.pIndex;.  u16
1b380 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
1b390 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 75 31 36  btree.nEq;.  u16
1b3a0 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e   nSkip = pLoop->
1b3b0 6e 53 6b 69 70 3b 0a 20 20 69 6e 74 20 69 2c 20  nSkip;.  int i, 
1b3c0 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  j;.  Column *aCo
1b3d0 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a  l = pTab->aCol;.
1b3e0 20 20 69 31 36 20 2a 61 69 43 6f 6c 75 6d 6e 20    i16 *aiColumn 
1b3f0 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  = pIndex->aiColu
1b400 6d 6e 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d  mn;..  if( nEq==
1b410 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  0 && (pLoop->wsF
1b420 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f  lags&(WHERE_BTM_
1b430 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
1b440 4c 49 4d 49 54 29 29 3d 3d 30 20 29 20 72 65 74  LIMIT))==0 ) ret
1b450 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 74  urn;.  sqlite3St
1b460 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
1b470 72 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20 66  r, " (", 2);.  f
1b480 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69  or(i=0; i<nEq; i
1b490 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
1b4a0 20 3d 20 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3c   = aiColumn[i] <
1b4b0 20 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61   0 ? "rowid" : a
1b4c0 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d  Col[aiColumn[i]]
1b4d0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
1b4e0 69 3e 3d 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  i>=nSkip ){.    
1b4f0 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54    explainAppendT
1b500 65 72 6d 28 70 53 74 72 2c 20 69 2c 20 7a 2c 20  erm(pStr, i, z, 
1b510 22 3d 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  "=");.    }else{
1b520 0a 20 20 20 20 20 20 69 66 28 20 69 20 29 20 73  .      if( i ) s
1b530 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
1b540 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44  pend(pStr, " AND
1b550 20 22 2c 20 35 29 3b 0a 20 20 20 20 20 20 73 71   ", 5);.      sq
1b560 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 53 74  lite3XPrintf(pSt
1b570 72 2c 20 30 2c 20 22 41 4e 59 28 25 73 29 22 2c  r, 0, "ANY(%s)",
1b580 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   z);.    }.  }..
1b590 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20 70    j = i;.  if( p
1b5a0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48  Loop->wsFlags&WH
1b5b0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
1b5c0 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61  .    char *z = a
1b5d0 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3c 20 30 20 3f  iColumn[j] < 0 ?
1b5e0 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b   "rowid" : aCol[
1b5f0 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
1b600 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41  me;.    explainA
1b610 70 70 65 6e 64 54 65 72 6d 28 70 53 74 72 2c 20  ppendTerm(pStr, 
1b620 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20 20  i++, z, ">");.  
1b630 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  }.  if( pLoop->w
1b640 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50  sFlags&WHERE_TOP
1b650 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68  _LIMIT ){.    ch
1b660 61 72 20 2a 7a 20 3d 20 61 69 43 6f 6c 75 6d 6e  ar *z = aiColumn
1b670 5b 6a 5d 20 3c 20 30 20 3f 20 22 72 6f 77 69 64  [j] < 0 ? "rowid
1b680 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d  " : aCol[aiColum
1b690 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  n[j]].zName;.   
1b6a0 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
1b6b0 72 6d 28 70 53 74 72 2c 20 69 2c 20 7a 2c 20 22  rm(pStr, i, z, "
1b6c0 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  <");.  }.  sqlit
1b6d0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1b6e0 28 70 53 74 72 2c 20 22 29 22 2c 20 31 29 3b 0a  (pStr, ")", 1);.
1b6f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1b700 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1b710 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74  p unless current
1b720 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  ly processing an
1b730 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
1b740 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2c 20  LAN.** command, 
1b750 6f 72 20 69 66 20 65 69 74 68 65 72 20 53 51 4c  or if either SQL
1b760 49 54 45 5f 44 45 42 55 47 20 6f 72 20 53 51 4c  ITE_DEBUG or SQL
1b770 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
1b780 53 43 41 4e 53 54 41 54 55 53 20 77 61 73 0a 2a  SCANSTATUS was.*
1b790 2a 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d  * defined at com
1b7a0 70 69 6c 65 2d 74 69 6d 65 2e 20 49 66 20 69 74  pile-time. If it
1b7b0 20 69 73 20 6e 6f 74 20 61 20 6e 6f 2d 6f 70 2c   is not a no-op,
1b7c0 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70   a single OP_Exp
1b7d0 6c 61 69 6e 20 6f 70 63 6f 64 65 20 0a 2a 2a 20  lain opcode .** 
1b7e0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
1b7f0 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72 69  output to descri
1b800 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63 61  be the table sca
1b810 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 70 4c  n strategy in pL
1b820 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  evel..**.** If a
1b830 6e 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63  n OP_Explain opc
1b840 6f 64 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  ode is added to 
1b850 74 68 65 20 56 4d 2c 20 69 74 73 20 61 64 64 72  the VM, its addr
1b860 65 73 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ess is returned.
1b870 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
1b880 66 20 6e 6f 20 4f 50 5f 45 78 70 6c 61 69 6e 20  f no OP_Explain 
1b890 69 73 20 63 6f 64 65 64 2c 20 7a 65 72 6f 20 69  is coded, zero i
1b8a0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1b8b0 74 61 74 69 63 20 69 6e 74 20 65 78 70 6c 61 69  tatic int explai
1b8c0 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73  nOneScan(.  Pars
1b8d0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1b8f0 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
1b900 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
1b910 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
1b920 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20    /* Table list 
1b930 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73  this loop refers
1b940 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65   to */.  WhereLe
1b950 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20  vel *pLevel,    
1b960 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e           /* Scan
1b970 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70   to write OP_Exp
1b980 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20  lain opcode for 
1b990 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
1b9c0 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e  r "level" column
1b9d0 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
1b9e0 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
1b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba00 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72  /* Value for "fr
1ba10 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75  om" column of ou
1ba20 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63  tput */.  u16 wc
1ba30 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
1ba40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1ba50 67 73 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  gs passed to sql
1ba60 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
1ba70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65 74   */.){.  int ret
1ba80 20 3d 20 30 3b 0a 23 69 66 20 21 64 65 66 69 6e   = 0;.#if !defin
1ba90 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1baa0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
1bab0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
1bac0 53 43 41 4e 53 54 41 54 55 53 29 0a 20 20 69 66  SCANSTATUS).  if
1bad0 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
1bae0 6e 3d 3d 32 20 29 0a 23 65 6e 64 69 66 0a 20 20  n==2 ).#endif.  
1baf0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
1bb00 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1bb10 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
1bb20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
1bb30 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
1bb40 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
1bb50 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f    /* VM being co
1bb60 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20  nstructed */.   
1bb70 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1bb80 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f  Parse->db;     /
1bb90 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
1bba0 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  e */.    int iId
1bbb0 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65   = pParse->iSele
1bbc0 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74  ctId;  /* Select
1bbd0 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f   id (left-most o
1bbe0 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f  utput column) */
1bbf0 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63  .    int isSearc
1bc00 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
1bc10 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
1bc20 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66   SEARCH. False f
1bc30 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20  or SCAN. */.    
1bc40 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
1bc50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1bc60 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67   The controlling
1bc70 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1bc80 74 20 2a 2f 0a 20 20 20 20 75 33 32 20 66 6c 61  t */.    u32 fla
1bc90 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1bca0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
1bcb0 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
1bcc0 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 63  is loop */.    c
1bcd0 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20  har *zMsg;      
1bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bcf0 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20 45  Text to add to E
1bd00 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  QP output */.   
1bd10 20 53 74 72 41 63 63 75 6d 20 73 74 72 3b 20 20   StrAccum str;  
1bd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bd30 2a 20 45 51 50 20 6f 75 74 70 75 74 20 73 74 72  * EQP output str
1bd40 69 6e 67 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ing */.    char 
1bd50 7a 42 75 66 5b 31 30 30 5d 3b 20 20 20 20 20 20  zBuf[100];      
1bd60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
1bd70 69 61 6c 20 73 70 61 63 65 20 66 6f 72 20 45 51  ial space for EQ
1bd80 50 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67 20  P output string 
1bd90 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  */..    pLoop = 
1bda0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
1bdb0 20 20 20 20 66 6c 61 67 73 20 3d 20 70 4c 6f 6f      flags = pLoo
1bdc0 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
1bdd0 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45  if( (flags&WHERE
1bde0 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77  _MULTI_OR) || (w
1bdf0 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
1be00 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29  ONETABLE_ONLY) )
1be10 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20   return 0;..    
1be20 69 73 53 65 61 72 63 68 20 3d 20 28 66 6c 61 67  isSearch = (flag
1be30 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  s&(WHERE_BTM_LIM
1be40 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
1be50 49 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IT))!=0.        
1be60 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 26 57      || ((flags&W
1be70 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1be80 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d  E)==0 && (pLoop-
1be90 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29 29  >u.btree.nEq>0))
1bea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
1beb0 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45  (wctrlFlags&(WHE
1bec0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57  RE_ORDERBY_MIN|W
1bed0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
1bee0 29 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ));..    sqlite3
1bef0 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 73 74  StrAccumInit(&st
1bf00 72 2c 20 7a 42 75 66 2c 20 73 69 7a 65 6f 66 28  r, zBuf, sizeof(
1bf10 7a 42 75 66 29 2c 20 53 51 4c 49 54 45 5f 4d 41  zBuf), SQLITE_MA
1bf20 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 20 20 73  X_LENGTH);.    s
1bf30 74 72 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  tr.db = db;.    
1bf40 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
1bf50 70 70 65 6e 64 41 6c 6c 28 26 73 74 72 2c 20 69  ppendAll(&str, i
1bf60 73 53 65 61 72 63 68 20 3f 20 22 53 45 41 52 43  sSearch ? "SEARC
1bf70 48 22 20 3a 20 22 53 43 41 4e 22 29 3b 0a 20 20  H" : "SCAN");.  
1bf80 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
1bf90 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
1bfa0 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 73 74  lite3XPrintf(&st
1bfb0 72 2c 20 30 2c 20 22 20 53 55 42 51 55 45 52 59  r, 0, " SUBQUERY
1bfc0 20 25 64 22 2c 20 70 49 74 65 6d 2d 3e 69 53 65   %d", pItem->iSe
1bfd0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c  lectId);.    }el
1bfe0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1bff0 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20 30  3XPrintf(&str, 0
1c000 2c 20 22 20 54 41 42 4c 45 20 25 73 22 2c 20 70  , " TABLE %s", p
1c010 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
1c020 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74    }..    if( pIt
1c030 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  em->zAlias ){.  
1c040 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
1c050 74 66 28 26 73 74 72 2c 20 30 2c 20 22 20 41 53  tf(&str, 0, " AS
1c060 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c   %s", pItem->zAl
1c070 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ias);.    }.    
1c080 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 57 48  if( (flags & (WH
1c090 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49  ERE_IPK|WHERE_VI
1c0a0 52 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30 20  RTUALTABLE))==0 
1c0b0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
1c0c0 68 61 72 20 2a 7a 46 6d 74 20 3d 20 30 3b 0a 20  har *zFmt = 0;. 
1c0d0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
1c0e0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
1c0f0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1c100 70 49 6e 64 65 78 21 3d 30 20 29 3b 0a 20 20 20  pIndex!=0 );.   
1c110 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d     pIdx = pLoop-
1c120 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
1c130 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1c140 28 66 6c 61 67 73 26 57 48 45 52 45 5f 41 55 54  (flags&WHERE_AUT
1c150 4f 5f 49 4e 44 45 58 29 20 7c 7c 20 28 66 6c 61  O_INDEX) || (fla
1c160 67 73 26 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  gs&WHERE_IDX_ONL
1c170 59 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Y) );.      if( 
1c180 21 48 61 73 52 6f 77 69 64 28 70 49 74 65 6d 2d  !HasRowid(pItem-
1c190 3e 70 54 61 62 29 20 26 26 20 49 73 50 72 69 6d  >pTab) && IsPrim
1c1a0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
1c1b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
1c1c0 20 69 73 53 65 61 72 63 68 20 29 7b 0a 20 20 20   isSearch ){.   
1c1d0 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 50         zFmt = "P
1c1e0 52 49 4d 41 52 59 20 4b 45 59 22 3b 0a 20 20 20  RIMARY KEY";.   
1c1f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1c200 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 57  se if( flags & W
1c210 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44 58 20  HERE_PARTIALIDX 
1c220 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74 20  ){.        zFmt 
1c230 3d 20 22 41 55 54 4f 4d 41 54 49 43 20 50 41 52  = "AUTOMATIC PAR
1c240 54 49 41 4c 20 43 4f 56 45 52 49 4e 47 20 49 4e  TIAL COVERING IN
1c250 44 45 58 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  DEX";.      }els
1c260 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 57 48  e if( flags & WH
1c270 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 20 29  ERE_AUTO_INDEX )
1c280 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d  {.        zFmt =
1c290 20 22 41 55 54 4f 4d 41 54 49 43 20 43 4f 56 45   "AUTOMATIC COVE
1c2a0 52 49 4e 47 20 49 4e 44 45 58 22 3b 0a 20 20 20  RING INDEX";.   
1c2b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61     }else if( fla
1c2c0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
1c2d0 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  NLY ){.        z
1c2e0 46 6d 74 20 3d 20 22 43 4f 56 45 52 49 4e 47 20  Fmt = "COVERING 
1c2f0 49 4e 44 45 58 20 25 73 22 3b 0a 20 20 20 20 20  INDEX %s";.     
1c300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c310 7a 46 6d 74 20 3d 20 22 49 4e 44 45 58 20 25 73  zFmt = "INDEX %s
1c320 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
1c330 20 69 66 28 20 7a 46 6d 74 20 29 7b 0a 20 20 20   if( zFmt ){.   
1c340 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
1c350 63 63 75 6d 41 70 70 65 6e 64 28 26 73 74 72 2c  ccumAppend(&str,
1c360 20 22 20 55 53 49 4e 47 20 22 2c 20 37 29 3b 0a   " USING ", 7);.
1c370 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58          sqlite3X
1c380 50 72 69 6e 74 66 28 26 73 74 72 2c 20 30 2c 20  Printf(&str, 0, 
1c390 7a 46 6d 74 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  zFmt, pIdx->zNam
1c3a0 65 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c  e);.        expl
1c3b0 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 26 73  ainIndexRange(&s
1c3c0 74 72 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d  tr, pLoop, pItem
1c3d0 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d  ->pTab);.      }
1c3e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
1c3f0 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  flags & WHERE_IP
1c400 4b 29 21 3d 30 20 26 26 20 28 66 6c 61 67 73 20  K)!=0 && (flags 
1c410 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49  & WHERE_CONSTRAI
1c420 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  NT)!=0 ){.      
1c430 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 61 6e  const char *zRan
1c440 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 66 6c  ge;.      if( fl
1c450 61 67 73 26 28 57 48 45 52 45 5f 43 4f 4c 55 4d  ags&(WHERE_COLUM
1c460 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  N_EQ|WHERE_COLUM
1c470 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  N_IN) ){.       
1c480 20 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f 77 69   zRange = "(rowi
1c490 64 3d 3f 29 22 3b 0a 20 20 20 20 20 20 7d 65 6c  d=?)";.      }el
1c4a0 73 65 20 69 66 28 20 28 66 6c 61 67 73 26 57 48  se if( (flags&WH
1c4b0 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d  ERE_BOTH_LIMIT)=
1c4c0 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49  =WHERE_BOTH_LIMI
1c4d0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 61  T ){.        zRa
1c4e0 6e 67 65 20 3d 20 22 28 72 6f 77 69 64 3e 3f 20  nge = "(rowid>? 
1c4f0 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 3b 0a 20  AND rowid<?)";. 
1c500 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
1c510 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c  lags&WHERE_BTM_L
1c520 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
1c530 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f 77 69 64  zRange = "(rowid
1c540 3e 3f 29 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  >?)";.      }els
1c550 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
1c560 74 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 54  t( flags&WHERE_T
1c570 4f 50 5f 4c 49 4d 49 54 29 3b 0a 20 20 20 20 20  OP_LIMIT);.     
1c580 20 20 20 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f     zRange = "(ro
1c590 77 69 64 3c 3f 29 22 3b 0a 20 20 20 20 20 20 7d  wid<?)";.      }
1c5a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
1c5b0 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28  rAccumAppendAll(
1c5c0 26 73 74 72 2c 20 22 20 55 53 49 4e 47 20 49 4e  &str, " USING IN
1c5d0 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1c5e0 59 20 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Y ");.      sqli
1c5f0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1c600 64 41 6c 6c 28 26 73 74 72 2c 20 7a 52 61 6e 67  dAll(&str, zRang
1c610 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  e);.    }.#ifnde
1c620 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1c630 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 65  RTUALTABLE.    e
1c640 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
1c650 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
1c660 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  BLE)!=0 ){.     
1c670 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
1c680 26 73 74 72 2c 20 30 2c 20 22 20 56 49 52 54 55  &str, 0, " VIRTU
1c690 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25  AL TABLE INDEX %
1c6a0 64 3a 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  d:%s",.         
1c6b0 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
1c6c0 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70  u.vtab.idxNum, p
1c6d0 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
1c6e0 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Str);.    }.#end
1c6f0 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1c700 5f 45 58 50 4c 41 49 4e 5f 45 53 54 49 4d 41 54  _EXPLAIN_ESTIMAT
1c710 45 44 5f 52 4f 57 53 0a 20 20 20 20 69 66 28 20  ED_ROWS.    if( 
1c720 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 3d 31 30 20  pLoop->nOut>=10 
1c730 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1c740 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20 30 2c  XPrintf(&str, 0,
1c750 20 22 20 28 7e 25 6c 6c 75 20 72 6f 77 73 29 22   " (~%llu rows)"
1c760 2c 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54  , sqlite3LogEstT
1c770 6f 49 6e 74 28 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  oInt(pLoop->nOut
1c780 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
1c790 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
1c7a0 63 63 75 6d 41 70 70 65 6e 64 28 26 73 74 72 2c  ccumAppend(&str,
1c7b0 20 22 20 28 7e 31 20 72 6f 77 29 22 2c 20 39 29   " (~1 row)", 9)
1c7c0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1c7d0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1c7e0 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
1c7f0 26 73 74 72 29 3b 0a 20 20 20 20 72 65 74 20 3d  &str);.    ret =
1c800 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c810 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
1c820 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69  , iId, iLevel, i
1c830 46 72 6f 6d 2c 20 7a 4d 73 67 2c 50 34 5f 44 59  From, zMsg,P4_DY
1c840 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 20 20 72 65  NAMIC);.  }.  re
1c850 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 23 65 6c 73  turn ret;.}.#els
1c860 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  e.# define expla
1c870 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c  inOneScan(u,v,w,
1c880 78 2c 79 2c 7a 29 20 30 0a 23 65 6e 64 69 66 20  x,y,z) 0.#endif 
1c890 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
1c8a0 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
1c8b0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1c8c0 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
1c8d0 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
1c8e0 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
1c8f0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1c900 65 6e 74 20 77 69 74 68 20 61 6e 0a 2a 2a 20 73  ent with an.** s
1c910 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
1c920 73 74 61 74 75 73 28 29 20 65 6e 74 72 79 20 63  status() entry c
1c930 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
1c940 74 68 65 20 73 63 61 6e 20 75 73 65 64 20 74 6f  the scan used to
1c950 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 6c   .** implement l
1c960 65 76 65 6c 20 70 4c 76 6c 2e 20 41 72 67 75 6d  evel pLvl. Argum
1c970 65 6e 74 20 70 53 72 63 6c 69 73 74 20 69 73 20  ent pSrclist is 
1c980 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1c990 20 46 52 4f 4d 20 0a 2a 2a 20 63 6c 61 75 73 65   FROM .** clause
1c9a0 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 72   that the scan r
1c9b0 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d 2e 0a  eads data from..
1c9c0 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
1c9d0 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20 69 73  t addrExplain is
1c9e0 20 6e 6f 74 20 30 2c 20 69 74 20 6d 75 73 74 20   not 0, it must 
1c9f0 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  be the address o
1ca00 66 20 61 6e 20 0a 2a 2a 20 4f 50 5f 45 78 70 6c  f an .** OP_Expl
1ca10 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ain instruction 
1ca20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
1ca30 68 65 20 73 61 6d 65 20 6c 6f 6f 70 2e 0a 2a 2f  he same loop..*/
1ca40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64  .static void add
1ca50 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64  ScanStatus(.  Vd
1ca60 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
1ca70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ca80 20 56 64 62 65 20 74 6f 20 61 64 64 20 73 63 61   Vdbe to add sca
1ca90 6e 73 74 61 74 75 73 20 65 6e 74 72 79 20 74 6f  nstatus entry to
1caa0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1cab0 53 72 63 6c 69 73 74 2c 20 20 20 20 20 20 20 20  Srclist,        
1cac0 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
1cad0 61 75 73 65 20 70 4c 76 6c 20 72 65 61 64 73 20  ause pLvl reads 
1cae0 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 57  data from */.  W
1caf0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 2c  hereLevel *pLvl,
1cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cb10 2a 20 4c 65 76 65 6c 20 74 6f 20 61 64 64 20 73  * Level to add s
1cb20 63 61 6e 73 74 61 74 75 73 28 29 20 65 6e 74 72  canstatus() entr
1cb30 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 61  y for */.  int a
1cb40 64 64 72 45 78 70 6c 61 69 6e 20 20 20 20 20 20  ddrExplain      
1cb50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1cb60 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70 6c  dress of OP_Expl
1cb70 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 29 7b  ain (or 0) */.){
1cb80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1cb90 4f 62 6a 20 3d 20 30 3b 0a 20 20 57 68 65 72 65  Obj = 0;.  Where
1cba0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c  Loop *pLoop = pL
1cbb0 76 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 66  vl->pWLoop;.  if
1cbc0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1cbd0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
1cbe0 4c 54 41 42 4c 45 29 3d 3d 30 20 20 26 26 20 20  LTABLE)==0  &&  
1cbf0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
1cc00 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20  Index!=0 ){.    
1cc10 7a 4f 62 6a 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  zObj = pLoop->u.
1cc20 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e  btree.pIndex->zN
1cc30 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
1cc40 20 20 7a 4f 62 6a 20 3d 20 70 53 72 63 6c 69 73    zObj = pSrclis
1cc50 74 2d 3e 61 5b 70 4c 76 6c 2d 3e 69 46 72 6f 6d  t->a[pLvl->iFrom
1cc60 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 73  ].zName;.  }.  s
1cc70 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e 53 74  qlite3VdbeScanSt
1cc80 61 74 75 73 28 0a 20 20 20 20 20 20 76 2c 20 61  atus(.      v, a
1cc90 64 64 72 45 78 70 6c 61 69 6e 2c 20 70 4c 76 6c  ddrExplain, pLvl
1cca0 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70 4c 76 6c  ->addrBody, pLvl
1ccb0 2d 3e 61 64 64 72 56 69 73 69 74 2c 20 70 4c 6f  ->addrVisit, pLo
1ccc0 6f 70 2d 3e 6e 4f 75 74 2c 20 7a 4f 62 6a 0a 20  op->nOut, zObj. 
1ccd0 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65   );.}.#else.# de
1cce0 66 69 6e 65 20 61 64 64 53 63 61 6e 53 74 61 74  fine addScanStat
1ccf0 75 73 28 61 2c 20 62 2c 20 63 2c 20 64 29 20 28  us(a, b, c, d) (
1cd00 28 76 6f 69 64 29 64 29 0a 23 65 6e 64 69 66 0a  (void)d).#endif.
1cd10 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 6f  ./*.** If the mo
1cd20 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65  st recently code
1cd30 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  d instruction is
1cd40 20 61 20 63 6f 6e 73 74 61 6e 74 20 72 61 6e 67   a constant rang
1cd50 65 20 63 6f 6e 74 72 61 69 6e 74 0a 2a 2a 20 74  e contraint.** t
1cd60 68 61 74 20 6f 72 69 67 69 6e 61 74 65 64 20 66  hat originated f
1cd70 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70 74  rom the LIKE opt
1cd80 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68 65 6e 20  imization, then 
1cd90 63 68 61 6e 67 65 20 74 68 65 20 50 33 20 74 6f  change the P3 to
1cda0 20 62 65 0a 2a 2a 20 70 4c 6f 6f 70 2d 3e 69 4c   be.** pLoop->iL
1cdb0 69 6b 65 52 65 70 43 6e 74 72 20 61 6e 64 20 73  ikeRepCntr and s
1cdc0 65 74 20 50 35 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  et P5..**.** The
1cdd0 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69   LIKE optimizati
1cde0 6f 6e 20 74 72 79 73 20 74 6f 20 65 76 61 6c 75  on trys to evalu
1cdf0 61 74 65 20 22 78 20 4c 49 4b 45 20 27 61 62 63  ate "x LIKE 'abc
1ce00 25 27 22 20 61 73 20 61 20 72 61 6e 67 65 0a 2a  %'" as a range.*
1ce10 2a 20 65 78 70 72 65 73 73 69 6f 6e 3a 20 22 78  * expression: "x
1ce20 3e 3d 27 41 42 43 27 20 41 4e 44 20 78 3c 27 61  >='ABC' AND x<'a
1ce30 62 64 27 22 2e 20 20 42 75 74 20 74 68 69 73 20  bd'".  But this 
1ce40 72 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68  requires that th
1ce50 65 20 72 61 6e 67 65 0a 2a 2a 20 73 63 61 6e 20  e range.** scan 
1ce60 6c 6f 6f 70 20 72 75 6e 20 74 77 69 63 65 2c 20  loop run twice, 
1ce70 6f 6e 63 65 20 66 6f 72 20 73 74 72 69 6e 67 73  once for strings
1ce80 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 74 69   and a second ti
1ce90 6d 65 20 66 6f 72 20 42 4c 4f 42 73 2e 0a 2a 2a  me for BLOBs..**
1cea0 20 54 68 65 20 4f 50 5f 53 74 72 69 6e 67 20 6f   The OP_String o
1ceb0 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 20 73 65  pcodes on the se
1cec0 63 6f 6e 64 20 70 61 73 73 20 63 6f 6e 76 65 72  cond pass conver
1ced0 74 20 74 68 65 20 75 70 70 65 72 20 61 6e 64 20  t the upper and 
1cee0 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 73  lower.** bound s
1cef0 74 72 69 6e 67 20 63 6f 6e 74 61 6e 74 73 20 74  tring contants t
1cf00 6f 20 62 6c 6f 62 73 2e 20 20 54 68 69 73 20 72  o blobs.  This r
1cf10 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65  outine makes the
1cf20 20 6e 65 63 65 73 73 61 72 79 20 63 68 61 6e 67   necessary chang
1cf30 65 73 0a 2a 2a 20 74 6f 20 74 68 65 20 4f 50 5f  es.** to the OP_
1cf40 53 74 72 69 6e 67 20 6f 70 63 6f 64 65 73 20 66  String opcodes f
1cf50 6f 72 20 74 68 61 74 20 74 6f 20 68 61 70 70 65  or that to happe
1cf60 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1cf70 64 20 77 68 65 72 65 4c 69 6b 65 4f 70 74 69 6d  d whereLikeOptim
1cf80 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67 46 69 78  izationStringFix
1cf90 75 70 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  up(.  Vdbe *v,  
1cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cfb0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
1cfc0 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
1cfd0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  uction */.  Wher
1cfe0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
1cff0 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70 20      /* The loop 
1d000 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
1d010 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  e LIKE operator 
1d020 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
1d030 70 54 65 72 6d 20 20 20 20 20 20 20 20 2f 2a 20  pTerm        /* 
1d040 54 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77  The upper or low
1d050 65 72 20 62 6f 75 6e 64 20 6a 75 73 74 20 63 6f  er bound just co
1d060 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ded */.){.  if( 
1d070 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1d080 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b   TERM_LIKEOPT ){
1d090 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
1d0a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
1d0b0 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e  evel->iLikeRepCn
1d0c0 74 72 3e 30 20 29 3b 0a 20 20 20 20 70 4f 70 20  tr>0 );.    pOp 
1d0d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
1d0e0 4f 70 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20 61  Op(v, -1);.    a
1d0f0 73 73 65 72 74 28 20 70 4f 70 21 3d 30 20 29 3b  ssert( pOp!=0 );
1d100 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
1d110 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 72  ->opcode==OP_Str
1d120 69 6e 67 38 20 0a 20 20 20 20 20 20 20 20 20 20  ing8 .          
1d130 20 20 7c 7c 20 70 54 65 72 6d 2d 3e 70 57 43 2d    || pTerm->pWC-
1d140 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  >pWInfo->pParse-
1d150 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1d160 64 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  d );.    pOp->p3
1d170 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65   = pLevel->iLike
1d180 52 65 70 43 6e 74 72 3b 0a 20 20 20 20 70 4f 70  RepCntr;.    pOp
1d190 2d 3e 70 35 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  ->p5 = 1;.  }.}.
1d1a0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1d1b0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74 61  code for the sta
1d1c0 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c  rt of the iLevel
1d1d0 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  -th loop in the 
1d1e0 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20  WHERE clause.** 
1d1f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
1d200 65 73 63 72 69 62 65 64 20 62 79 20 70 57 49 6e  escribed by pWIn
1d210 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  fo..*/.static Bi
1d220 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f  tmask codeOneLoo
1d230 70 53 74 61 72 74 28 0a 20 20 57 68 65 72 65 49  pStart(.  WhereI
1d240 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f  nfo *pWInfo,   /
1d250 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72  * Complete infor
1d260 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
1d270 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1d280 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
1d290 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
1d2a0 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f   level of pWInfo
1d2b0 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  ->a[] should be 
1d2c0 63 6f 64 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61  coded */.  Bitma
1d2d0 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20  sk notReady     
1d2e0 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73 20  /* Which tables 
1d2f0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76  are currently av
1d300 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  ailable */.){.  
1d310 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20  int j, k;       
1d320 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1d330 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
1d340 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
1d350 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
1d360 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  or for the table
1d370 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78   */.  int addrNx
1d380 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  t;         /* Wh
1d390 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63  ere to jump to c
1d3a0 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65  ontinue with the
1d3b0 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f   next IN case */
1d3c0 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65  .  int omitTable
1d3d0 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
1d3e0 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e  if we use the in
1d3f0 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e  dex only */.  in
1d400 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20  t bRev;         
1d410 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65     /* True if we
1d420 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e   need to scan in
1d430 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
1d440 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
1d450 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20  pLevel;  /* The 
1d460 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20 62  where level to b
1d470 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  e coded */.  Whe
1d480 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20  reLoop *pLoop;  
1d490 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
1d4a0 6f 70 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20  op object being 
1d4b0 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  coded */.  Where
1d4c0 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
1d4d0 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1d4e0 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 57   of the entire W
1d4f0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
1d500 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1d510 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1d520 20 2f 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75   /* A WHERE clau
1d530 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72  se term */.  Par
1d540 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
1d550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d560 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1d570 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1d580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d590 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1d5a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1d5b0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
1d5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5d0 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
1d5e0 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73   stmt under cons
1d5f0 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  tructions */.  s
1d600 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1d610 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
1d620 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
1d630 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  rm being coded *
1d640 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b  /.  int addrBrk;
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d660 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1d670 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
1d680 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
1d690 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20  nt addrCont;    
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d6b0 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
1d6c0 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
1d6d0 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74  t cycle */.  int
1d6e0 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20   iRowidReg = 0; 
1d6f0 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
1d700 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69  is stored in thi
1d710 73 20 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e  s register, if n
1d720 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74  ot zero */.  int
1d730 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30   iReleaseReg = 0
1d740 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72  ;      /* Temp r
1d750 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20  egister to free 
1d760 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1d770 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
1d780 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
1d790 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
1d7a0 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 26 70 57  dbe;.  pWC = &pW
1d7b0 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 64 62 20  Info->sWC;.  db 
1d7c0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1d7d0 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
1d7e0 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70  ->a[iLevel];.  p
1d7f0 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
1d800 57 4c 6f 6f 70 3b 0a 20 20 70 54 61 62 49 74 65  WLoop;.  pTabIte
1d810 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61  m = &pWInfo->pTa
1d820 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
1d830 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20  >iFrom];.  iCur 
1d840 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
1d850 73 6f 72 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 6e  sor;.  pLevel->n
1d860 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74 52 65 61  otReady = notRea
1d870 64 79 20 26 20 7e 67 65 74 4d 61 73 6b 28 26 70  dy & ~getMask(&p
1d880 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
1d890 20 69 43 75 72 29 3b 0a 20 20 62 52 65 76 20 3d   iCur);.  bRev =
1d8a0 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73   (pWInfo->revMas
1d8b0 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a 20 20  k>>iLevel)&1;.  
1d8c0 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 6f  omitTable = (pLo
1d8d0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1d8e0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30  ERE_IDX_ONLY)!=0
1d8f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20   .           && 
1d900 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
1d910 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43  ags & WHERE_FORC
1d920 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 20 20 56  E_TABLE)==0;.  V
1d930 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
1d940 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52  ((v, "Begin WHER
1d950 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 69 4c  E-loop%d: %s",iL
1d960 65 76 65 6c 2c 70 54 61 62 49 74 65 6d 2d 3e 70  evel,pTabItem->p
1d970 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  Tab->zName));.. 
1d980 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c   /* Create label
1d990 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b  s for the "break
1d9a0 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22  " and "continue"
1d9b0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20   instructions.  
1d9c0 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ** for the curre
1d9d0 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74  nt loop.  Jump t
1d9e0 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65  o addrBrk to bre
1d9f0 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ak out of a loop
1da00 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63  ..  ** Jump to c
1da10 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69  ont to go immedi
1da20 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78  ately to the nex
1da30 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
1da40 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20  he.  ** loop..  
1da50 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65  **.  ** When the
1da60 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72  re is an IN oper
1da70 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61  ator, we also ha
1da80 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c  ve a "addrNxt" l
1da90 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d  abel that.  ** m
1daa0 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  eans to continue
1dab0 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49   with the next I
1dac0 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74  N value combinat
1dad0 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20  ion.  When.  ** 
1dae0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20  there are no IN 
1daf0 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65  operators in the
1db00 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
1db10 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65  e "addrNxt" labe
1db20 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61  l.  ** is the sa
1db30 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e  me as "addrBrk".
1db40 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20  .  */.  addrBrk 
1db50 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
1db60 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
1db70 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
1db80 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1db90 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76   addrCont = pLev
1dba0 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73  el->addrCont = s
1dbb0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1dbc0 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66  bel(v);..  /* If
1dbd0 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67   this is the rig
1dbe0 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
1dbf0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61  FT OUTER JOIN, a
1dc00 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a  llocate and.  **
1dc10 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65   initialize a me
1dc20 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72  mory cell that r
1dc30 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74  ecords if this t
1dc40 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79  able matches any
1dc50 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65  .  ** row of the
1dc60 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74   left table of t
1dc70 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
1dc80 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  if( pLevel->iFro
1dc90 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d  m>0 && (pTabItem
1dca0 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  [0].jointype & J
1dcb0 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20  T_LEFT)!=0 ){.  
1dcc0 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a    pLevel->iLeftJ
1dcd0 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oin = ++pParse->
1dce0 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
1dcf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1dd00 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c  P_Integer, 0, pL
1dd10 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
1dd20 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
1dd30 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54  t((v, "init LEFT
1dd40 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66   JOIN no-match f
1dd50 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lag"));.  }..  /
1dd60 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f  * Special case o
1dd70 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  f a FROM clause 
1dd80 73 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65  subquery impleme
1dd90 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
1dda0 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54  tine */.  if( pT
1ddb0 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75  abItem->viaCorou
1ddc0 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tine ){.    int 
1ddd0 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49  regYield = pTabI
1dde0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a  tem->regReturn;.
1ddf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1de00 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
1de10 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69  Coroutine, regYi
1de20 65 6c 64 2c 20 30 2c 20 70 54 61 62 49 74 65 6d  eld, 0, pTabItem
1de30 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a  ->addrFillSub);.
1de40 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
1de50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1de60 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1de70 20 72 65 67 59 69 65 6c 64 2c 20 61 64 64 72 42   regYield, addrB
1de80 72 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  rk);.    VdbeCov
1de90 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
1dea0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e  beComment((v, "n
1deb0 65 78 74 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c  ext row of \"%s\
1dec0 22 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  "", pTabItem->pT
1ded0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
1dee0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1def0 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a  _Goto;.  }else..
1df00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1df10 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1df20 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d 3e  .  if(  (pLoop->
1df30 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1df40 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
1df50 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1df60 31 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69 73  1:  The table is
1df70 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65   a virtual-table
1df80 2e 20 20 55 73 65 20 74 68 65 20 56 46 69 6c 74  .  Use the VFilt
1df90 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20  er and VNext.   
1dfa0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20   **          to 
1dfb0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 2e  access the data.
1dfc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
1dfd0 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61  iReg;   /* P3 Va
1dfe0 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74  lue for OP_VFilt
1dff0 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
1e000 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20 20  drNotFound;.    
1e010 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  int nConstraint 
1e020 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b  = pLoop->nLTerm;
1e030 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ..    sqlite3Exp
1e040 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1e050 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73  e);.    iReg = s
1e060 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1e070 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73  ge(pParse, nCons
1e080 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61  traint+2);.    a
1e090 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c  ddrNotFound = pL
1e0a0 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20  evel->addrBrk;. 
1e0b0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
1e0c0 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b  onstraint; j++){
1e0d0 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 72 67  .      int iTarg
1e0e0 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20  et = iReg+j+2;. 
1e0f0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f       pTerm = pLo
1e100 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20  op->aLTerm[j];. 
1e110 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
1e120 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1e130 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
1e140 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
1e150 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
1e160 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
1e170 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
1e180 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54 61  el, j, bRev, iTa
1e190 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 61  rget);.        a
1e1a0 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c  ddrNotFound = pL
1e1b0 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
1e1c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e1d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e1e0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54 65 72  ode(pParse, pTer
1e1f0 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
1e200 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20  , iTarget);.    
1e210 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1e220 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e230 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
1e240 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
1e250 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Num, iReg);.    
1e260 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e270 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1e280 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69 52   nConstraint, iR
1e290 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  eg+1);.    sqlit
1e2a0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1e2b0 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72  OP_VFilter, iCur
1e2c0 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20  , addrNotFound, 
1e2d0 69 52 65 67 2c 0a 20 20 20 20 20 20 20 20 20 20  iReg,.          
1e2e0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
1e2f0 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
1e300 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e310 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75          pLoop->u
1e320 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3f  .vtab.needFree ?
1e330 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34   P4_MPRINTF : P4
1e340 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 56 64  _STATIC);.    Vd
1e350 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1e360 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62     pLoop->u.vtab
1e370 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
1e380 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
1e390 6f 6e 73 74 72 61 69 6e 74 20 26 26 20 6a 3c 31  onstraint && j<1
1e3a0 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  6; j++){.      i
1e3b0 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  f( (pLoop->u.vta
1e3c0 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31  b.omitMask>>j)&1
1e3d0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
1e3e0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1e3f0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
1e400 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1e410 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1e420 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20  = OP_VNext;.    
1e430 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
1e440 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
1e450 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
1e460 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1e470 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1e480 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
1e490 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72  e, iReg, nConstr
1e4a0 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c  aint+2);.    sql
1e4b0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
1e4c0 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 65 6c 73  (pParse);.  }els
1e4d0 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
1e4e0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1e4f0 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 28  ABLE */..  if( (
1e500 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1e510 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20   WHERE_IPK)!=0. 
1e520 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
1e530 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f  lags & (WHERE_CO
1e540 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f  LUMN_IN|WHERE_CO
1e550 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20 29  LUMN_EQ))!=0.  )
1e560 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a  {.    /* Case 2:
1e570 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c    We can directl
1e580 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69  y reference a si
1e590 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61  ngle row using a
1e5a0 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  n.    **        
1e5b0 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61    equality compa
1e5c0 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
1e5d0 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20  e ROWID field.  
1e5e0 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  Or.    **       
1e5f0 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20     we reference 
1e600 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73  multiple rows us
1e610 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20  ing a "rowid IN 
1e620 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20  (...)".    **   
1e630 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74         construct
1e640 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1e650 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ert( pLoop->u.bt
1e660 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20 20  ree.nEq==1 );.  
1e670 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d    pTerm = pLoop-
1e680 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20  >aLTerm[0];.    
1e690 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
1e6a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1e6b0 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20  pTerm->pExpr!=0 
1e6c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  );.    assert( o
1e6d0 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
1e6e0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1e6f0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1e700 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1e710 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20    iReleaseReg = 
1e720 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1e730 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
1e740 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
1e750 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
1e760 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52 65 76 2c  pLevel, 0, bRev,
1e770 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20   iReleaseReg);. 
1e780 20 20 20 69 66 28 20 69 52 6f 77 69 64 52 65 67     if( iRowidReg
1e790 21 3d 69 52 65 6c 65 61 73 65 52 65 67 20 29 20  !=iReleaseReg ) 
1e7a0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1e7b0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52  mpReg(pParse, iR
1e7c0 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20  eleaseReg);.    
1e7d0 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
1e7e0 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73  ->addrNxt;.    s
1e7f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e800 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
1e810 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64  , iRowidReg, add
1e820 72 4e 78 74 29 3b 20 56 64 62 65 43 6f 76 65 72  rNxt); VdbeCover
1e830 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1e840 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1e850 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69   OP_NotExists, i
1e860 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52  Cur, addrNxt, iR
1e870 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64  owidReg);.    Vd
1e880 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1e890 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e8a0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1e8b0 65 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69 64  e(pParse, iRowid
1e8c0 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  Reg, 1);.    sql
1e8d0 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
1e8e0 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
1e8f0 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
1e900 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
1e910 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
1e920 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1e930 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69  _Noop;.  }else i
1e940 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1e950 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
1e960 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
1e970 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1e980 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
1e990 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  NGE)!=0.  ){.   
1e9a0 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65 20   /* Case 3:  We 
1e9b0 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  have an inequali
1e9c0 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
1e9d0 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
1e9e0 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  field..    */.  
1e9f0 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f    int testOp = O
1ea00 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  P_Noop;.    int 
1ea10 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d  start;.    int m
1ea20 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a  emEndValue = 0;.
1ea30 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1ea40 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20  Start, *pEnd;.. 
1ea50 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
1ea60 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 6a  able==0 );.    j
1ea70 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
1ea80 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20   = pEnd = 0;.   
1ea90 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1eaa0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
1eab0 4c 49 4d 49 54 20 29 20 70 53 74 61 72 74 20 3d  LIMIT ) pStart =
1eac0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1ead0 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  ++];.    if( pLo
1eae0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1eaf0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20  ERE_TOP_LIMIT ) 
1eb00 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  pEnd = pLoop->aL
1eb10 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61  Term[j++];.    a
1eb20 73 73 65 72 74 28 20 70 53 74 61 72 74 21 3d 30  ssert( pStart!=0
1eb30 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20   || pEnd!=0 );. 
1eb40 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
1eb50 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74       pTerm = pSt
1eb60 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72  art;.      pStar
1eb70 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  t = pEnd;.      
1eb80 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pEnd = pTerm;.  
1eb90 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61    }.    if( pSta
1eba0 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rt ){.      Expr
1ebb0 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
1ebc0 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
1ebd0 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73  ion that defines
1ebe0 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64   the start bound
1ebf0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31   */.      int r1
1ec00 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20  , rTemp;        
1ec10 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f 72  /* Registers for
1ec20 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61   holding the sta
1ec30 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a  rt boundary */..
1ec40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
1ec50 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20  lowing constant 
1ec60 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73  maps TK_xx codes
1ec70 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64   into correspond
1ec80 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65  ing .      ** se
1ec90 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20  ek opcodes.  It 
1eca0 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72  depends on a par
1ecb0 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67  ticular ordering
1ecc0 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20   of TK_xx.      
1ecd0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
1ece0 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a  8 aMoveOp[] = {.
1ecf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
1ed00 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47  _GT */  OP_SeekG
1ed10 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  T,.           /*
1ed20 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65   TK_LE */  OP_Se
1ed30 65 6b 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20  ekLE,.          
1ed40 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50   /* TK_LT */  OP
1ed50 5f 53 65 65 6b 4c 54 2c 0a 20 20 20 20 20 20 20  _SeekLT,.       
1ed60 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20      /* TK_GE */ 
1ed70 20 4f 50 5f 53 65 65 6b 47 45 0a 20 20 20 20 20   OP_SeekGE.     
1ed80 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   };.      assert
1ed90 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31  ( TK_LE==TK_GT+1
1eda0 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65   );      /* Make
1edb0 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72 69   sure the orderi
1edc0 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ng.. */.      as
1edd0 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
1ede0 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+2 );      /* 
1edf0 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78   ... of the TK_x
1ee00 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20  x values... */. 
1ee10 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1ee20 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20  GE==TK_GT+3 );  
1ee30 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63      /*  ... is c
1ee40 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20  orrecct. */..   
1ee50 20 20 20 61 73 73 65 72 74 28 20 28 70 53 74 61     assert( (pSta
1ee60 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
1ee70 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
1ee80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ee90 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
1eea0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1eeb0 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74  ;.      pX = pSt
1eec0 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  art->pExpr;.    
1eed0 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
1eee0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1eef0 65 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43  e( pStart->leftC
1ef00 75 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f  ursor!=iCur ); /
1ef10 2a 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e  * transitive con
1ef20 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
1ef30 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1ef40 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1ef50 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26  e, pX->pRight, &
1ef60 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  rTemp);.      sq
1ef70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1ef80 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f  v, aMoveOp[pX->o
1ef90 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20  p-TK_GT], iCur, 
1efa0 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20  addrBrk, r1);.  
1efb0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1efc0 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
1efd0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1efe0 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47  (v, pX->op==TK_G
1eff0 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  T);.      VdbeCo
1f000 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e  verageIf(v, pX->
1f010 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20 20 20  op==TK_LE);.    
1f020 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1f030 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c  (v, pX->op==TK_L
1f040 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  T);.      VdbeCo
1f050 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e  verageIf(v, pX->
1f060 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20  op==TK_GE);.    
1f070 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f080 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1f090 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b  (pParse, r1, 1);
1f0a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
1f0b0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1f0c0 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20  rse, rTemp);.   
1f0d0 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
1f0e0 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a  Level, pStart);.
1f0f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f100 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f110 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  p2(v, bRev ? OP_
1f120 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
1f130 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
1f140 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1f150 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d  rageIf(v, bRev==
1f160 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  0);.      VdbeCo
1f170 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
1f180 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  !=0);.    }.    
1f190 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20  if( pEnd ){.    
1f1a0 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20    Expr *pX;.    
1f1b0 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78    pX = pEnd->pEx
1f1c0 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
1f1d0 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
1f1e0 20 61 73 73 65 72 74 28 20 28 70 45 6e 64 2d 3e   assert( (pEnd->
1f1f0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1f200 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NULL)==0 );.    
1f210 20 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64    testcase( pEnd
1f220 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43  ->leftCursor!=iC
1f230 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e 73 69 74  ur ); /* Transit
1f240 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ive constraints 
1f250 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
1f260 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73  e( pEnd->wtFlags
1f270 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1f280 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56  );.      memEndV
1f290 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  alue = ++pParse-
1f2a0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
1f2b0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1f2c0 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
1f2d0 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20   memEndValue);. 
1f2e0 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d       if( pX->op=
1f2f0 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70  =TK_LT || pX->op
1f300 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20  ==TK_GT ){.     
1f310 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
1f320 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65   ? OP_Le : OP_Ge
1f330 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1f340 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
1f350 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f  bRev ? OP_Lt : O
1f360 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  P_Gt;.      }.  
1f370 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1f380 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20  pLevel, pEnd);. 
1f390 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20 3d     }.    start =
1f3a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1f3b0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1f3c0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65  pLevel->op = bRe
1f3d0 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50  v ? OP_Prev : OP
1f3e0 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  _Next;.    pLeve
1f3f0 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
1f400 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
1f410 74 61 72 74 3b 0a 20 20 20 20 61 73 73 65 72 74  tart;.    assert
1f420 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
1f430 29 3b 0a 20 20 20 20 69 66 28 20 74 65 73 74 4f  );.    if( testO
1f440 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
1f450 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
1f460 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1f470 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f480 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
1f490 77 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69  wid, iCur, iRowi
1f4a0 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
1f4b0 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
1f4c0 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
1f4d0 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
1f4e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f4f0 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74  beAddOp3(v, test
1f500 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c  Op, memEndValue,
1f510 20 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64   addrBrk, iRowid
1f520 52 65 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Reg);.      Vdbe
1f530 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74 65  CoverageIf(v, te
1f540 73 74 4f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  stOp==OP_Le);.  
1f550 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1f560 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50  If(v, testOp==OP
1f570 5f 4c 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Lt);.      Vdbe
1f580 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74 65  CoverageIf(v, te
1f590 73 74 4f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  stOp==OP_Ge);.  
1f5a0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1f5b0 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50  If(v, testOp==OP
1f5c0 5f 47 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  _Gt);.      sqli
1f5d0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1f5e0 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  v, SQLITE_AFF_NU
1f5f0 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a  MERIC | SQLITE_J
1f600 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1f610 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c  }.  }else if( pL
1f620 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1f630 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a  HERE_INDEXED ){.
1f640 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 41      /* Case 4: A
1f650 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69   scan using an i
1f660 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ndex..    **.   
1f670 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
1f680 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79  WHERE clause may
1f690 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72   contain zero or
1f6a0 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a   more equality .
1f6b0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
1f6c0 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49  erms ("==" or "I
1f6d0 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68  N" operators) th
1f6e0 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
1f6f0 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  N.    **        
1f700 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
1f710 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ns of the index.
1f720 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e   It may also con
1f730 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  tain.    **     
1f740 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63      inequality c
1f750 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c  onstraints (>, <
1f760 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74  , >= or <=) on t
1f770 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a  he indexed.    *
1f780 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
1f790 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c   that immediatel
1f7a0 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20  y follows the N 
1f7b0 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79  equalities. Only
1f7c0 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
1f7d0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
1f7e0 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e  column can be an
1f7f0 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68   inequality - th
1f800 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20  e rest must.    
1f810 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74  **         use t
1f820 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22  he "==" and "IN"
1f830 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20   operators. For 
1f840 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
1f850 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f860 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79  index is on (x,y
1f870 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f  ,z), then the fo
1f880 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20  llowing clauses 
1f890 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  are all .    ** 
1f8a0 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65          optimize
1f8b0 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d:.    **.    **
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a              x=5.
1f8d0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1f8e0 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20    x=5 AND y=10. 
1f8f0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1f900 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   x=5 AND y<10.  
1f910 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1f920 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20  x=5 AND y>5 AND 
1f930 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y<10.    **     
1f940 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1f950 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20  =5 AND z<=10.   
1f960 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1f970 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d     The z<10 term
1f980 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1f990 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  g cannot be used
1f9a0 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20  , only.    **   
1f9b0 20 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65        the x=5 te
1f9c0 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rm:.    **.    *
1f9d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1f9e0 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a   AND z<10.    **
1f9f0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1fa00 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66  N may be zero if
1fa10 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75   there are inequ
1fa20 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1fa30 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  s..    **       
1fa40 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e    If there are n
1fa50 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  o inequality con
1fa60 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e  straints, then N
1fa70 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20   is at.    **   
1fa80 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e        least one.
1fa90 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1faa0 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65         This case
1fab0 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
1fac0 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
1fad0 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20  WHERE clause.   
1fae0 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73   **         cons
1faf0 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69  traints but an i
1fb00 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64  ndex is selected
1fb10 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65   anyway, in orde
1fb20 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
1fb30 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75   to force the ou
1fb40 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f  tput order to co
1fb50 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45  nform to an ORDE
1fb60 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20  R BY..    */  . 
1fb70 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1fb80 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20  u8 aStartOp[] = 
1fb90 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20  {.      0,.     
1fba0 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77   0,.      OP_Rew
1fbb0 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ind,           /
1fbc0 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e  * 2: (!start_con
1fbd0 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72  straints && star
1fbe0 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a  tEq &&  !bRev) *
1fbf0 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c  /.      OP_Last,
1fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fc10 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  3: (!start_const
1fc20 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
1fc30 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a  q &&   bRev) */.
1fc40 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 54 2c        OP_SeekGT,
1fc50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a             /* 4:
1fc60 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
1fc70 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71  nts  && !startEq
1fc80 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
1fc90 20 20 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 20 20      OP_SeekLT,  
1fca0 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28           /* 5: (
1fcb0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1fcc0 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
1fcd0 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
1fce0 20 20 4f 50 5f 53 65 65 6b 47 45 2c 20 20 20 20    OP_SeekGE,    
1fcf0 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74         /* 6: (st
1fd00 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1fd10 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20   &&  startEq && 
1fd20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1fd30 4f 50 5f 53 65 65 6b 4c 45 20 20 20 20 20 20 20  OP_SeekLE       
1fd40 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72       /* 7: (star
1fd50 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1fd60 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62  &  startEq &&  b
1fd70 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  Rev) */.    };. 
1fd80 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1fd90 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a  u8 aEndOp[] = {.
1fda0 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20        OP_IdxGE, 
1fdb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a             /* 0:
1fdc0 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74   (end_constraint
1fdd0 73 20 26 26 20 21 62 52 65 76 20 26 26 20 21 65  s && !bRev && !e
1fde0 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f  ndEq) */.      O
1fdf0 50 5f 49 64 78 47 54 2c 20 20 20 20 20 20 20 20  P_IdxGT,        
1fe00 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63      /* 1: (end_c
1fe10 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62  onstraints && !b
1fe20 52 65 76 20 26 26 20 20 65 6e 64 45 71 29 20 2a  Rev &&  endEq) *
1fe30 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 45  /.      OP_IdxLE
1fe40 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1fe50 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  2: (end_constrai
1fe60 6e 74 73 20 26 26 20 20 62 52 65 76 20 26 26 20  nts &&  bRev && 
1fe70 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 20  !endEq) */.     
1fe80 20 4f 50 5f 49 64 78 4c 54 2c 20 20 20 20 20 20   OP_IdxLT,      
1fe90 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 65 6e 64        /* 3: (end
1fea0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1feb0 20 62 52 65 76 20 26 26 20 20 65 6e 64 45 71 29   bRev &&  endEq)
1fec0 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 75   */.    };.    u
1fed0 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  16 nEq = pLoop->
1fee0 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20 20 20 20  u.btree.nEq;    
1fef0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d   /* Number of ==
1ff00 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a   or IN terms */.
1ff10 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b      int regBase;
1ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff30 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
1ff40 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72  r holding constr
1ff50 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20  aint values */. 
1ff60 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
1ff70 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20  angeStart = 0;  
1ff80 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
1ff90 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
1ffa0 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57  e start */.    W
1ffb0 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
1ffc0 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  End = 0;    /* I
1ffd0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1ffe0 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e  aint at range en
1fff0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61  d */.    int sta
20000 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  rtEq;           
20010 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20020 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65   range start use
20030 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a  s ==, >= or <= *
20040 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b  /.    int endEq;
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20060 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61     /* True if ra
20070 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c  nge end uses ==,
20080 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20   >= or <= */.   
20090 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74   int start_const
200a0 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a  raints;       /*
200b0 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20   Start of range 
200c0 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a  is constrained *
200d0 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  /.    int nConst
200e0 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  raint;          
200f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20100 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
20110 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
20120 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
20130 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
20140 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69  x we will be usi
20150 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  ng */.    int iI
20160 64 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20  dxCur;          
20170 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
20180 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
20190 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  e index */.    i
201a0 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30  nt nExtraReg = 0
201b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
201c0 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
201d0 65 67 69 73 74 65 72 73 20 6e 65 65 64 65 64 20  egisters needed 
201e0 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20  */.    int op;  
201f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20200 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69      /* Instructi
20210 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  on opcode */.   
20220 20 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66   char *zStartAff
20230 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
20240 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74   Affinity for st
20250 61 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e  art of range con
20260 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63  straint */.    c
20270 68 61 72 20 63 45 6e 64 41 66 66 20 3d 20 30 3b  har cEndAff = 0;
20280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
20290 66 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20  ffinity for end 
202a0 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  of range constra
202b0 69 6e 74 20 2a 2f 0a 20 20 20 20 75 38 20 62 53  int */.    u8 bS
202c0 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 30 3b  eekPastNull = 0;
202d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
202e0 74 6f 20 73 65 65 6b 20 70 61 73 74 20 69 6e 69  to seek past ini
202f0 74 69 61 6c 20 6e 75 6c 6c 73 20 2a 2f 0a 20 20  tial nulls */.  
20300 20 20 75 38 20 62 53 74 6f 70 41 74 4e 75 6c 6c    u8 bStopAtNull
20310 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
20320 2a 20 41 64 64 20 63 6f 6e 64 69 74 69 6f 6e 20  * Add condition 
20330 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 61 74 20  to terminate at 
20340 4e 55 4c 4c 73 20 2a 2f 0a 0a 20 20 20 20 70 49  NULLs */..    pI
20350 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
20360 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
20370 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
20380 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 61  ->iIdxCur;.    a
20390 73 73 65 72 74 28 20 6e 45 71 3e 3d 70 4c 6f 6f  ssert( nEq>=pLoo
203a0 70 2d 3e 6e 53 6b 69 70 20 29 3b 0a 0a 20 20 20  p->nSkip );..   
203b0 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70   /* If this loop
203c0 20 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72   satisfies a sor
203d0 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42  t order (pOrderB
203e0 79 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20  y) request that 
203f0 0a 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73  .    ** was pass
20400 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
20410 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ion to implement
20420 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
20430 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71  ) ..." .    ** q
20440 75 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63  uery, then the c
20450 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20  aller will only 
20460 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74  allow the loop t
20470 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a  o run for.    **
20480 20 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74   a single iterat
20490 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
204a0 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72  that the first r
204b0 6f 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20  ow returned.    
204c0 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61  ** should not ha
204d0 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  ve a NULL value 
204e0 73 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49  stored in 'x'. I
204f0 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a  f column 'x' is.
20500 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74      ** the first
20510 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e   one after the n
20520 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  Eq equality cons
20530 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69  traints in the i
20540 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69  ndex,.    ** thi
20550 73 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20  s requires some 
20560 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
20570 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
20580 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  ert( pWInfo->pOr
20590 64 65 72 42 79 3d 3d 30 0a 20 20 20 20 20 20 20  derBy==0.       
205a0 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72    || pWInfo->pOr
205b0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 0a  derBy->nExpr==1.
205c0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 57 49           || (pWI
205d0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26  nfo->wctrlFlags&
205e0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
205f0 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  N)==0 );.    if(
20600 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
20610 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
20620 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20  BY_MIN)!=0.     
20630 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  && pWInfo->nOBSa
20640 74 3e 30 0a 20 20 20 20 20 26 26 20 28 70 49 64  t>0.     && (pId
20650 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 71 29 0a  x->nKeyCol>nEq).
20660 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
20670 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69  ert( pLoop->nSki
20680 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 53  p==0 );.      bS
20690 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 31 3b  eekPastNull = 1;
206a0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
206b0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
206c0 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65   /* Find any ine
206d0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
206e0 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65  nt terms for the
206f0 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a   start and end .
20700 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61      ** of the ra
20710 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nge. .    */.   
20720 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66   j = nEq;.    if
20730 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
20740 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
20750 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
20760 67 65 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d  geStart = pLoop-
20770 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
20780 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
20790 31 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 69 6b 65  1;.      /* Like
207a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 72 61   optimization ra
207b0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
207c0 61 6c 77 61 79 73 20 6f 63 63 75 72 20 69 6e 20  always occur in 
207d0 70 61 69 72 73 20 2a 2f 0a 20 20 20 20 20 20 61  pairs */.      a
207e0 73 73 65 72 74 28 20 28 70 52 61 6e 67 65 53 74  ssert( (pRangeSt
207f0 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
20800 45 52 4d 5f 4c 49 4b 45 4f 50 54 29 3d 3d 30 20  ERM_LIKEOPT)==0 
20810 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
20820 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67    (pLoop->wsFlag
20830 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
20840 4d 49 54 29 21 3d 30 20 29 3b 0a 20 20 20 20 7d  MIT)!=0 );.    }
20850 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
20860 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
20870 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
20880 20 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70     pRangeEnd = p
20890 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b  Loop->aLTerm[j++
208a0 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52  ];.      nExtraR
208b0 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  eg = 1;.      if
208c0 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  ( (pRangeEnd->wt
208d0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b  Flags & TERM_LIK
208e0 45 4f 50 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  EOPT)!=0 ){.    
208f0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 61 6e      assert( pRan
20900 67 65 53 74 61 72 74 21 3d 30 20 29 3b 20 20 20  geStart!=0 );   
20910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20920 20 20 2f 2a 20 4c 49 4b 45 20 6f 70 74 20 63 6f    /* LIKE opt co
20930 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20  nstraints */.   
20940 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 61       assert( pRa
20950 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ngeStart->wtFlag
20960 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54  s & TERM_LIKEOPT
20970 20 29 3b 20 20 20 2f 2a 20 6f 63 63 75 72 20 69   );   /* occur i
20980 6e 20 70 61 69 72 73 20 2a 2f 0a 20 20 20 20 20  n pairs */.     
20990 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65     pLevel->iLike
209a0 52 65 70 43 6e 74 72 20 3d 20 2b 2b 70 50 61 72  RepCntr = ++pPar
209b0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
209c0 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76    testcase( bRev
209d0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
209e0 63 61 73 65 28 20 70 49 64 78 2d 3e 61 53 6f 72  case( pIdx->aSor
209f0 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c  tOrder[nEq]==SQL
20a00 49 54 45 5f 53 4f 5f 44 45 53 43 20 29 3b 0a 20  ITE_SO_DESC );. 
20a10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20a20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
20a30 6e 74 65 67 65 72 2c 0a 20 20 20 20 20 20 20 20  nteger,.        
20a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a50 20 20 62 52 65 76 20 5e 20 28 70 49 64 78 2d 3e    bRev ^ (pIdx->
20a60 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d  aSortOrder[nEq]=
20a70 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 29  =SQLITE_SO_DESC)
20a80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20a90 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 76              pLev
20aa0 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72  el->iLikeRepCntr
20ab0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
20ac0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4b 45  omment((v, "LIKE
20ad0 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 22 29 29   loop counter"))
20ae0 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c  ;.        pLevel
20af0 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 20 3d 20  ->addrLikeRep = 
20b00 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
20b10 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
20b20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 52 61   }.      if( pRa
20b30 6e 67 65 53 74 61 72 74 3d 3d 30 0a 20 20 20 20  ngeStart==0.    
20b40 20 20 20 26 26 20 28 6a 20 3d 20 70 49 64 78 2d     && (j = pIdx-
20b50 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3e  >aiColumn[nEq])>
20b60 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 49  =0 .       && pI
20b70 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
20b80 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20  [j].notNull==0. 
20b90 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
20ba0 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20  bSeekPastNull = 
20bb0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
20bc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 61  .    assert( pRa
20bd0 6e 67 65 45 6e 64 3d 3d 30 20 7c 7c 20 28 70 52  ngeEnd==0 || (pR
20be0 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
20bf0 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
20c00 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e  0 );..    /* Gen
20c10 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
20c20 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74  aluate all const
20c30 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e  raint terms usin
20c40 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a  g == or IN.    *
20c50 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
20c60 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20  values of those 
20c70 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61  terms in an arra
20c80 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  y of registers. 
20c90 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
20ca0 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a  t regBase..    *
20cb0 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  /.    regBase = 
20cc0 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
20cd0 65 72 6d 73 28 70 50 61 72 73 65 2c 70 4c 65 76  erms(pParse,pLev
20ce0 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61 52 65  el,bRev,nExtraRe
20cf0 67 2c 26 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  g,&zStartAff);. 
20d00 20 20 20 61 73 73 65 72 74 28 20 7a 53 74 61 72     assert( zStar
20d10 74 41 66 66 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  tAff==0 || sqlit
20d20 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 61 72  e3Strlen30(zStar
20d30 74 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20  tAff)>=nEq );.  
20d40 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66 20    if( zStartAff 
20d50 29 20 63 45 6e 64 41 66 66 20 3d 20 7a 53 74 61  ) cEndAff = zSta
20d60 72 74 41 66 66 5b 6e 45 71 5d 3b 0a 20 20 20 20  rtAff[nEq];.    
20d70 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
20d80 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20  ->addrNxt;..    
20d90 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
20da0 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72 64  ng a reverse ord
20db0 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73  er scan on an as
20dc0 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f  cending index, o
20dd0 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61  r.    ** a forwa
20de0 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e  rd order scan on
20df0 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
20e00 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65  dex, interchange
20e10 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61   the .    ** sta
20e20 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73  rt and end terms
20e30 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e   (pRangeStart an
20e40 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20  d pRangeEnd)..  
20e50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e 45    */.    if( (nE
20e60 71 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  q<pIdx->nKeyCol 
20e70 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e  && bRev==(pIdx->
20e80 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d  aSortOrder[nEq]=
20e90 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29  =SQLITE_SO_ASC))
20ea0 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20 26  .     || (bRev &
20eb0 26 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d  & pIdx->nKeyCol=
20ec0 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  =nEq).    ){.   
20ed0 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72     SWAP(WhereTer
20ee0 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20  m *, pRangeEnd, 
20ef0 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
20f00 20 20 20 20 53 57 41 50 28 75 38 2c 20 62 53 65      SWAP(u8, bSe
20f10 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 62 53 74 6f  ekPastNull, bSto
20f20 70 41 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a  pAtNull);.    }.
20f30 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
20f40 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28 70  RangeStart && (p
20f50 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
20f60 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d  rator & WO_LE)!=
20f70 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
20f80 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26  e( pRangeStart &
20f90 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  & (pRangeStart->
20fa0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
20fb0 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  E)!=0 );.    tes
20fc0 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
20fd0 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e   && (pRangeEnd->
20fe0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
20ff0 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  E)!=0 );.    tes
21000 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
21010 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e   && (pRangeEnd->
21020 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
21030 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 74 61  E)!=0 );.    sta
21040 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74  rtEq = !pRangeSt
21050 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61  art || pRangeSta
21060 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
21070 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
21080 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52     endEq =   !pR
21090 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67  angeEnd || pRang
210a0 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
210b0 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
210c0 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74  .    start_const
210d0 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53  raints = pRangeS
210e0 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a  tart || nEq>0;..
210f0 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
21100 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20  index cursor to 
21110 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
21120 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e   range. */.    n
21130 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71  Constraint = nEq
21140 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65  ;.    if( pRange
21150 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
21160 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52  xpr *pRight = pR
21170 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72  angeStart->pExpr
21180 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
21190 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
211a0 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
211b0 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
211c0 20 20 20 20 77 68 65 72 65 4c 69 6b 65 4f 70 74      whereLikeOpt
211d0 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67 46  imizationStringF
211e0 69 78 75 70 28 76 2c 20 70 4c 65 76 65 6c 2c 20  ixup(v, pLevel, 
211f0 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
21200 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 53      if( (pRangeS
21210 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
21220 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20  TERM_VNULL)==0. 
21230 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
21240 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52  ExprCanBeNull(pR
21250 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20  ight).      ){. 
21260 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21270 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
21280 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e  sNull, regBase+n
21290 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  Eq, addrNxt);.  
212a0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
212b0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ge(v);.      }. 
212c0 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41       if( zStartA
212d0 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
212e0 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
212f0 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
21300 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29   zStartAff[nEq])
21310 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
21320 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  E){.          /*
21330 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61   Since the compa
21340 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70  rison is to be p
21350 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f  erformed with no
21360 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20   conversions.   
21370 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65         ** applie
21380 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64  d to the operand
21390 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e  s, set the affin
213a0 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ity to apply to 
213b0 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20  pRight to .     
213c0 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41       ** SQLITE_A
213d0 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20  FF_NONE.  */.   
213e0 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66         zStartAff
213f0 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
21400 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
21410 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
21420 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
21430 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
21440 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66  pRight, zStartAf
21450 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20  f[nEq]) ){.     
21460 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e       zStartAff[n
21470 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
21480 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
21490 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20  .      }  .     
214a0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
214b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
214c0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46  pRangeStart->wtF
214d0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
214e0 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  UAL );.    }else
214f0 20 69 66 28 20 62 53 65 65 6b 50 61 73 74 4e 75   if( bSeekPastNu
21500 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
21510 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21520 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
21530 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
21540 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
21550 20 20 20 20 20 20 73 74 61 72 74 45 71 20 3d 20        startEq = 
21560 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63  0;.      start_c
21570 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a  onstraints = 1;.
21580 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70      }.    codeAp
21590 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
215a0 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
215b0 6e 73 74 72 61 69 6e 74 20 2d 20 62 53 65 65 6b  nstraint - bSeek
215c0 50 61 73 74 4e 75 6c 6c 2c 20 7a 53 74 61 72 74  PastNull, zStart
215d0 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61  Aff);.    op = a
215e0 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63  StartOp[(start_c
215f0 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b  onstraints<<2) +
21600 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20   (startEq<<1) + 
21610 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72  bRev];.    asser
21620 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20  t( op!=0 );.    
21630 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21640 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
21650 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
21660 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
21670 6e 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  nt);.    VdbeCov
21680 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
21690 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
216a0 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 29 3b 20  op==OP_Rewind); 
216b0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
216c0 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20  P_Rewind );.    
216d0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
216e0 2c 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 29 3b 20  , op==OP_Last); 
216f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
21700 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20  =OP_Last );.    
21710 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
21720 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 29  , op==OP_SeekGT)
21730 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
21740 3d 4f 50 5f 53 65 65 6b 47 54 20 29 3b 0a 20 20  =OP_SeekGT );.  
21750 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
21760 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  (v, op==OP_SeekG
21770 45 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f  E);  testcase( o
21780 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 29 3b 0a  p==OP_SeekGE );.
21790 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
217a0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65  If(v, op==OP_See
217b0 6b 4c 45 29 3b 20 20 74 65 73 74 63 61 73 65 28  kLE);  testcase(
217c0 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29   op==OP_SeekLE )
217d0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
217e0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53  geIf(v, op==OP_S
217f0 65 65 6b 4c 54 29 3b 20 20 74 65 73 74 63 61 73  eekLT);  testcas
21800 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54  e( op==OP_SeekLT
21810 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64   );..    /* Load
21820 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   the value for t
21830 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  he inequality co
21840 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65 20  nstraint at the 
21850 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
21860 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29  * range (if any)
21870 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f  ..    */.    nCo
21880 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
21890 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e      if( pRangeEn
218a0 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  d ){.      Expr 
218b0 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65  *pRight = pRange
218c0 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  End->pExpr->pRig
218d0 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
218e0 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
218f0 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
21900 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20  +nEq, 1);.      
21910 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
21920 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
21930 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
21940 20 20 20 20 77 68 65 72 65 4c 69 6b 65 4f 70 74      whereLikeOpt
21950 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67 46  imizationStringF
21960 69 78 75 70 28 76 2c 20 70 4c 65 76 65 6c 2c 20  ixup(v, pLevel, 
21970 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20  pRangeEnd);.    
21980 20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64    if( (pRangeEnd
21990 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
219a0 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20  _VNULL)==0.     
219b0 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
219c0 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74  CanBeNull(pRight
219d0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
219e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
219f0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
21a00 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  l, regBase+nEq, 
21a10 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
21a20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
21a30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21a40 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
21a50 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
21a60 68 74 2c 20 63 45 6e 64 41 66 66 29 21 3d 53 51  ht, cEndAff)!=SQ
21a70 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 20 20  LITE_AFF_NONE.  
21a80 20 20 20 20 20 26 26 20 21 73 71 6c 69 74 65 33       && !sqlite3
21a90 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
21aa0 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
21ab0 2c 20 63 45 6e 64 41 66 66 29 0a 20 20 20 20 20  , cEndAff).     
21ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
21ad0 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50  ApplyAffinity(pP
21ae0 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45  arse, regBase+nE
21af0 71 2c 20 31 2c 20 26 63 45 6e 64 41 66 66 29 3b  q, 1, &cEndAff);
21b00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
21b10 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
21b20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
21b30 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
21b40 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
21b50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
21b60 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20 29 7b 0a   bStopAtNull ){.
21b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21b80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
21b90 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e  ll, 0, regBase+n
21ba0 45 71 29 3b 0a 20 20 20 20 20 20 65 6e 64 45 71  Eq);.      endEq
21bb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 43 6f 6e   = 0;.      nCon
21bc0 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d  straint++;.    }
21bd0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
21be0 65 65 28 64 62 2c 20 7a 53 74 61 72 74 41 66 66  ee(db, zStartAff
21bf0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f  );..    /* Top o
21c00 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20  f the loop body 
21c10 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  */.    pLevel->p
21c20 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
21c30 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
21c40 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
21c50 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
21c60 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64   is past the end
21c70 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
21c80 2f 0a 20 20 20 20 69 66 28 20 6e 43 6f 6e 73 74  /.    if( nConst
21c90 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 6f  raint ){.      o
21ca0 70 20 3d 20 61 45 6e 64 4f 70 5b 62 52 65 76 2a  p = aEndOp[bRev*
21cb0 32 20 2b 20 65 6e 64 45 71 5d 3b 0a 20 20 20 20  2 + endEq];.    
21cc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21cd0 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49  Op4Int(v, op, iI
21ce0 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20  dxCur, addrNxt, 
21cf0 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
21d00 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 74 65 73  aint);.      tes
21d10 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
21d20 78 47 54 20 29 3b 20 20 56 64 62 65 43 6f 76 65  xGT );  VdbeCove
21d30 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
21d40 5f 49 64 78 47 54 20 29 3b 0a 20 20 20 20 20 20  _IdxGT );.      
21d50 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
21d60 5f 49 64 78 47 45 20 29 3b 20 20 56 64 62 65 43  _IdxGE );  VdbeC
21d70 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
21d80 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20  =OP_IdxGE );.   
21d90 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
21da0 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 20 20 56 64  =OP_IdxLT );  Vd
21db0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
21dc0 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a  op==OP_IdxLT );.
21dd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21de0 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b 20  op==OP_IdxLE ); 
21df0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
21e00 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20  v, op==OP_IdxLE 
21e10 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
21e20 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20   Seek the table 
21e30 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69  cursor, if requi
21e40 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62  red */.    disab
21e50 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
21e60 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20  RangeStart);.   
21e70 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
21e80 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b  vel, pRangeEnd);
21e90 0a 20 20 20 20 69 66 28 20 6f 6d 69 74 54 61 62  .    if( omitTab
21ea0 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  le ){.      /* p
21eb0 49 64 78 20 69 73 20 61 20 63 6f 76 65 72 69 6e  Idx is a coverin
21ec0 67 20 69 6e 64 65 78 2e 20 20 4e 6f 20 6e 65 65  g index.  No nee
21ed0 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  d to access the 
21ee0 6d 61 69 6e 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  main table. */. 
21ef0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 48 61 73     }else if( Has
21f00 52 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62  Rowid(pIdx->pTab
21f10 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 69 52 6f  le) ){.      iRo
21f20 77 69 64 52 65 67 20 3d 20 2b 2b 70 50 61 72 73  widReg = ++pPars
21f30 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
21f40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21f50 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
21f60 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64   iIdxCur, iRowid
21f70 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
21f80 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
21f90 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
21fa0 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
21fb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21fc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
21fd0 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  ek, iCur, iRowid
21fe0 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72  Reg);  /* Deferr
21ff0 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d  ed seek */.    }
22000 65 6c 73 65 20 69 66 28 20 69 43 75 72 21 3d 69  else if( iCur!=i
22010 49 64 78 43 75 72 20 29 7b 0a 20 20 20 20 20 20  IdxCur ){.      
22020 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
22030 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
22040 64 65 78 28 70 49 64 78 2d 3e 70 54 61 62 6c 65  dex(pIdx->pTable
22050 29 3b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  );.      iRowidR
22060 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
22070 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
22080 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a   pPk->nKeyCol);.
22090 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
220a0 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  <pPk->nKeyCol; j
220b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d  ++){.        k =
220c0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
220d0 49 6e 64 65 78 28 70 49 64 78 2c 20 70 50 6b 2d  Index(pIdx, pPk-
220e0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20  >aiColumn[j]);. 
220f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22100 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
22110 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
22120 6b 2c 20 69 52 6f 77 69 64 52 65 67 2b 6a 29 3b  k, iRowidReg+j);
22130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
22140 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
22150 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
22160 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 43 6f  nd, iCur, addrCo
22170 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  nt,.            
22180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
22190 52 6f 77 69 64 52 65 67 2c 20 70 50 6b 2d 3e 6e  RowidReg, pPk->n
221a0 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76  KeyCol); VdbeCov
221b0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
221c0 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  .    /* Record t
221d0 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75  he instruction u
221e0 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  sed to terminate
221f0 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62   the loop. Disab
22200 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45  le .    ** WHERE
22210 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
22220 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20  de redundant by 
22230 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20  the index range 
22240 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  scan..    */.   
22250 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
22260 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
22270 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  OW ){.      pLev
22280 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  el->op = OP_Noop
22290 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
222a0 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4c  bRev ){.      pL
222b0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72  evel->op = OP_Pr
222c0 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ev;.    }else{. 
222d0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
222e0 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d  = OP_Next;.    }
222f0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
22300 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 70  = iIdxCur;.    p
22310 4c 65 76 65 6c 2d 3e 70 33 20 3d 20 28 70 4c 6f  Level->p3 = (pLo
22320 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52  op->wsFlags&WHER
22330 45 5f 55 4e 51 5f 57 41 4e 54 45 44 29 21 3d 30  E_UNQ_WANTED)!=0
22340 20 3f 20 31 3a 30 3b 0a 20 20 20 20 69 66 28 20   ? 1:0;.    if( 
22350 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
22360 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49  & WHERE_CONSTRAI
22370 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  NT)==0 ){.      
22380 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c  pLevel->p5 = SQL
22390 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
223a0 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20  ULLSCAN_STEP;.  
223b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
223c0 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
223d0 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  5==0 );.    }.  
223e0 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
223f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
22400 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  TIMIZATION.  if(
22410 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
22420 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
22430 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
22440 35 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20  5:  Two or more 
22450 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64 65 78  separately index
22460 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
22470 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a  ed by OR.    **.
22480 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
22490 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
224a0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
224b0 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a  a,b,c,d);.    **
224c0 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
224d0 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20  i1 ON t1(a);.   
224e0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
224f0 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a  EX i2 ON t1(b);.
22500 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
22510 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28 63  INDEX i3 ON t1(c
22520 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
22530 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
22540 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 4f 52   t1 WHERE a=5 OR
22550 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20 41 4e   b=7 OR (c=11 AN
22560 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20  D d=13).    **. 
22570 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78 61     ** In the exa
22580 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20  mple, there are 
22590 74 68 72 65 65 20 69 6e 64 65 78 65 64 20 74 65  three indexed te
225a0 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
225b0 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20   OR..    ** The 
225c0 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  top of the loop 
225d0 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
225e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
225f0 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20          Null    
22600 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
22610 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72      # Zero the r
22620 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20  owset in reg 1. 
22630 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
22640 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65  n, for each inde
22650 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20 66 6f  xed term, the fo
22660 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61 72 67  llowing. The arg
22670 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a  uments to.    **
22680 20 52 6f 77 53 65 74 54 65 73 74 20 61 72 65 20   RowSetTest are 
22690 73 75 63 68 20 74 68 61 74 20 74 68 65 20 72 6f  such that the ro
226a0 77 69 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  wid of the curre
226b0 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74  nt row is insert
226c0 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  ed.    ** into t
226d0 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20 69 74  he RowSet. If it
226e0 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73   is already pres
226f0 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69  ent, control ski
22700 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f  ps the.    ** Go
22710 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a  sub opcode and j
22720 75 6d 70 73 20 73 74 72 61 69 67 68 74 20 74 6f  umps straight to
22730 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
22740 74 65 64 20 62 79 20 57 68 65 72 65 45 6e 64 28  ted by WhereEnd(
22750 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
22760 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
22770 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e  hereBegin(<term>
22780 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ).    **        
22790 20 20 52 6f 77 53 65 74 54 65 73 74 20 20 20 20    RowSetTest    
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
227b0 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69 6e 74  Insert rowid int
227c0 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20  o rowset.    ** 
227d0 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 20           Gosub  
227e0 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a 20 20      2 A.    **  
227f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
22800 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20  reEnd().    **. 
22810 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20     ** Following 
22820 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64 65 20  the above, code 
22830 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
22840 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20   loop. Label A, 
22850 74 68 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a  the target.    *
22860 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62 20 61  * of the Gosub a
22870 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74  bove, jumps to t
22880 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72  he instruction r
22890 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 47  ight after the G
228a0 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oto..    **.    
228b0 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c  **          Null
228c0 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
228d0 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74          # Zero t
228e0 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67  he rowset in reg
228f0 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   1.    **       
22900 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20 42 20     Goto       B 
22910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
22920 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e   The loop is fin
22930 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  ished..    **.  
22940 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c    **       A: <l
22950 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20 20 20  oop body>       
22960 20 20 20 20 20 20 20 20 20 20 23 20 52 65 74 75            # Retu
22970 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65 76 65  rn data, whateve
22980 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
22990 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
229a0 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
229b0 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62 61 63        # Jump bac
229c0 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62 0a 20  k to the Gosub. 
229d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
229e0 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74 68 65     B: <after the
229f0 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20   loop>.    **.  
22a00 20 20 2a 2a 20 41 64 64 65 64 20 32 30 31 34 2d    ** Added 2014-
22a10 30 35 2d 32 36 3a 20 49 66 20 74 68 65 20 74 61  05-26: If the ta
22a20 62 6c 65 20 69 73 20 61 20 57 49 54 48 4f 55 54  ble is a WITHOUT
22a30 20 52 4f 57 49 44 20 74 61 62 6c 65 2c 20 74 68   ROWID table, th
22a40 65 6e 0a 20 20 20 20 2a 2a 20 75 73 65 20 61 6e  en.    ** use an
22a50 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
22a60 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 52 6f   instead of a Ro
22a70 77 53 65 74 20 74 6f 20 72 65 63 6f 72 64 20 74  wSet to record t
22a80 68 65 20 70 72 69 6d 61 72 79 0a 20 20 20 20 2a  he primary.    *
22a90 2a 20 6b 65 79 73 20 6f 66 20 74 68 65 20 72 6f  * keys of the ro
22aa0 77 73 20 77 65 20 68 61 76 65 20 61 6c 72 65 61  ws we have alrea
22ab0 64 79 20 73 65 65 6e 2e 0a 20 20 20 20 2a 2a 0a  dy seen..    **.
22ac0 20 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65      */.    Where
22ad0 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20  Clause *pOrWc;  
22ae0 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75    /* The OR-clau
22af0 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e  se broken out in
22b00 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20  to subterms */. 
22b10 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4f 72 54     SrcList *pOrT
22b20 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 6f  ab;       /* Sho
22b30 72 74 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73  rtened table lis
22b40 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20 67  t or OR-clause g
22b50 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  eneration */.   
22b60 20 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20 30   Index *pCov = 0
22b70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
22b80 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65 72   Potential cover
22b90 69 6e 67 20 69 6e 64 65 78 20 28 6f 72 20 4e 55  ing index (or NU
22ba0 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  LL) */.    int i
22bb0 43 6f 76 43 75 72 20 3d 20 70 50 61 72 73 65 2d  CovCur = pParse-
22bc0 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75 72  >nTab++;  /* Cur
22bd0 73 6f 72 20 75 73 65 64 20 66 6f 72 20 69 6e 64  sor used for ind
22be0 65 78 20 73 63 61 6e 73 20 28 69 66 20 61 6e 79  ex scans (if any
22bf0 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65  ) */..    int re
22c00 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
22c10 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20  se->nMem;       
22c20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
22c30 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73  used with OP_Gos
22c40 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ub */.    int re
22c50 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20  gRowset = 0;    
22c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c70 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
22c80 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  for RowSet objec
22c90 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  t */.    int reg
22ca0 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20  Rowid = 0;      
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cc0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
22cd0 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a  olding rowid */.
22ce0 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64      int iLoopBod
22cf0 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  y = sqlite3VdbeM
22d00 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
22d10 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62   Start of loop b
22d20 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ody */.    int i
22d30 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20  RetInit;        
22d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d50 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
22d60 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69  of regReturn ini
22d70 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74  t */.    int unt
22d80 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20  estedTerms = 0; 
22d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
22da0 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f  ome terms not co
22db0 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20  mpletely tested 
22dc0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  */.    int ii;  
22dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
22df0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
22e00 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b   u16 wctrlFlags;
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
22e30 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73   sub-WHERE claus
22e40 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  e */.    Expr *p
22e50 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20 20  AndExpr = 0;    
22e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
22e70 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22  n ".. AND (...)"
22e80 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
22e90 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
22ea0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
22eb0 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d  .   .    pTerm =
22ec0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30   pLoop->aLTerm[0
22ed0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
22ee0 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61  Term!=0 );.    a
22ef0 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
22f00 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20  perator & WO_OR 
22f10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
22f20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
22f30 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30   TERM_ORINFO)!=0
22f40 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20   );.    pOrWc = 
22f50 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
22f60 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65  o->wc;.    pLeve
22f70 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72  l->op = OP_Retur
22f80 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  n;.    pLevel->p
22f90 31 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a  1 = regReturn;..
22fa0 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20      /* Set up a 
22fb0 6e 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70  new SrcList in p
22fc0 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67  OrTab containing
22fd0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
22fe0 20 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20   scanned.    ** 
22ff0 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20  by this loop in 
23000 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e  the a[0] slot an
23010 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74  d all notReady t
23020 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20  ables in a[1..] 
23030 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68  slots..    ** Th
23040 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53  is becomes the S
23050 72 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65  rcList in the re
23060 63 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20  cursive call to 
23070 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
23080 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  n()..    */.    
23090 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
230a0 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  el>1 ){.      in
230b0 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20  t nNotReady;    
230c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
230d0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f  The number of no
230e0 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f  tReady tables */
230f0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
23100 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67  cList_item *orig
23110 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  Src;     /* Orig
23120 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62  inal list of tab
23130 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f  les */.      nNo
23140 74 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d  tReady = pWInfo-
23150 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c  >nLevel - iLevel
23160 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54   - 1;.      pOrT
23170 61 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63  ab = sqlite3Stac
23180 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20 20  kAllocRaw(db,.  
23190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231a0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
231b0 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52  (*pOrTab)+ nNotR
231c0 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54  eady*sizeof(pOrT
231d0 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  ab->a[0]));.    
231e0 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20    if( pOrTab==0 
231f0 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64  ) return notRead
23200 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d  y;.      pOrTab-
23210 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e  >nAlloc = (u8)(n
23220 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20  NotReady + 1);. 
23230 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72       pOrTab->nSr
23240 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c  c = pOrTab->nAll
23250 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  oc;.      memcpy
23260 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62  (pOrTab->a, pTab
23270 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54  Item, sizeof(*pT
23280 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20  abItem));.      
23290 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f  origSrc = pWInfo
232a0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  ->pTabList->a;. 
232b0 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
232c0 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29  =nNotReady; k++)
232d0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
232e0 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20  (&pOrTab->a[k], 
232f0 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b  &origSrc[pLevel[
23300 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f  k].iFrom], sizeo
23310 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29  f(pOrTab->a[k]))
23320 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
23330 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61  lse{.      pOrTa
23340 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  b = pWInfo->pTab
23350 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  List;.    }..   
23360 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
23370 68 65 20 72 6f 77 73 65 74 20 72 65 67 69 73 74  he rowset regist
23380 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55  er to contain NU
23390 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20  LL. An SQL NULL 
233a0 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76  is .    ** equiv
233b0 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74  alent to an empt
233c0 79 20 72 6f 77 73 65 74 2e 20 20 4f 72 2c 20 63  y rowset.  Or, c
233d0 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  reate an ephemer
233e0 61 6c 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20  al index.    ** 
233f0 63 61 70 61 62 6c 65 20 6f 66 20 68 6f 6c 64 69  capable of holdi
23400 6e 67 20 70 72 69 6d 61 72 79 20 6b 65 79 73 20  ng primary keys 
23410 69 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 61  in the case of a
23420 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 0a   WITHOUT ROWID..
23430 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
23440 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65  so initialize re
23450 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61  gReturn to conta
23460 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  in the address o
23470 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  f the instructio
23480 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  n .    ** immedi
23490 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
234a0 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74  the OP_Return at
234b0 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   the bottom of t
234c0 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20  he loop. This.  
234d0 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
234e0 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72   in a few obscur
234f0 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65  e LEFT JOIN case
23500 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20  s where control 
23510 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65  jumps.    ** ove
23520 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  r the top of the
23530 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62   loop into the b
23540 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68  ody of it. In th
23550 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20  is case the .   
23560 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70   ** correct resp
23570 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64  onse for the end
23580 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74  -of-loop code (t
23590 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73  he OP_Return) is
235a0 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c   to .    ** fall
235b0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
235c0 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
235d0 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f  , just as an OP_
235e0 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20  Next does if.   
235f0 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   ** called on an
23600 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63   uninitialized c
23610 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ursor..    */.  
23620 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
23630 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
23640 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
23650 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
23660 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
23670 29 7b 0a 20 20 20 20 20 20 20 20 72 65 67 52 6f  ){.        regRo
23680 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  wset = ++pParse-
23690 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73  >nMem;.        s
236a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
236b0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
236c0 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20  regRowset);.    
236d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
236e0 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71   Index *pPk = sq
236f0 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
23700 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
23710 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20      regRowset = 
23720 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
23730 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23740 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23750 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 72  OpenEphemeral, r
23760 65 67 52 6f 77 73 65 74 2c 20 70 50 6b 2d 3e 6e  egRowset, pPk->n
23770 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  KeyCol);.       
23780 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
23790 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  4KeyInfo(pParse,
237a0 20 70 50 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20   pPk);.      }. 
237b0 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20       regRowid = 
237c0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
237d0 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e      }.    iRetIn
237e0 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  it = sqlite3Vdbe
237f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
23800 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75  eger, 0, regRetu
23810 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  rn);..    /* If 
23820 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45  the original WHE
23830 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a 20 6f  RE clause is z o
23840 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28 78 31  f the form:  (x1
23850 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41   OR x2 OR ...) A
23860 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e  ND y.    ** Then
23870 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20   for every term 
23880 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61 73 20  xN, evaluate as 
23890 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
238a0 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20  n: xN AND z.    
238b0 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74 65 72  ** That way, ter
238c0 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61 72 65  ms in y that are
238d0 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20 74   factored into t
238e0 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77  he disjunction w
238f0 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 69  ill.    ** be pi
23900 63 6b 65 64 20 75 70 20 62 79 20 74 68 65 20 72  cked up by the r
23910 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74  ecursive calls t
23920 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
23930 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20  gin() below..   
23940 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75 61   **.    ** Actua
23950 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65 78 70  lly, each subexp
23960 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65  ression is conve
23970 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e 44 20  rted to "xN AND 
23980 77 22 20 77 68 65 72 65 20 77 20 69 73 0a 20 20  w" where w is.  
23990 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65 72 65    ** the "intere
239a0 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f 66 20  sting" terms of 
239b0 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74 20 64  z - terms that d
239c0 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
239d0 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f   in the.    ** O
239e0 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
239f0 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
23a00 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68 61 74  , and terms that
23a10 20 61 72 65 20 75 73 61 62 6c 65 20 61 73 20 0a   are usable as .
23a20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a      ** indices..
23a30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
23a40 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
23a50 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65  also only applie
23a60 73 20 69 66 20 74 68 65 20 28 78 31 20 4f 52 20  s if the (x1 OR 
23a70 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a  x2 OR ...) term.
23a80 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f      ** is not co
23a90 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 4f  ntained in the O
23aa0 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45  N clause of a LE
23ab0 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20  FT JOIN..    ** 
23ac0 53 65 65 20 74 69 63 6b 65 74 20 68 74 74 70 3a  See ticket http:
23ad0 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
23ae0 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33  /src/info/f23693
23af0 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20  04e4.    */.    
23b00 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31  if( pWC->nTerm>1
23b10 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54   ){.      int iT
23b20 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  erm;.      for(i
23b30 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57  Term=0; iTerm<pW
23b40 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b  C->nTerm; iTerm+
23b50 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
23b60 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e 61   *pExpr = pWC->a
23b70 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20  [iTerm].pExpr;. 
23b80 20 20 20 20 20 20 20 69 66 28 20 26 70 57 43 2d         if( &pWC-
23b90 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d 20 70 54 65  >a[iTerm] == pTe
23ba0 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  rm ) continue;. 
23bb0 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
23bc0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
23bd0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
23be0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
23bf0 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69     if( (pWC->a[i
23c00 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20  Term].wtFlags & 
23c10 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30  TERM_VIRTUAL)!=0
23c20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23c30 20 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61       if( (pWC->a
23c40 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f  [iTerm].eOperato
23c50 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29  r & WO_ALL)==0 )
23c60 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
23c70 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57 43     testcase( pWC
23c80 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61  ->a[iTerm].wtFla
23c90 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  gs & TERM_ORINFO
23ca0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70   );.        pExp
23cb0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
23cc0 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
23cd0 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78  ;.        pAndEx
23ce0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
23cf0 41 6e 64 28 64 62 2c 20 70 41 6e 64 45 78 70 72  And(db, pAndExpr
23d00 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
23d10 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64  }.      if( pAnd
23d20 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
23d30 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
23d40 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
23d50 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45  TK_AND, 0, pAndE
23d60 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  xpr, 0);.      }
23d70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
23d80 75 6e 20 61 20 73 65 70 61 72 61 74 65 20 57 48  un a separate WH
23d90 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65  ERE clause for e
23da0 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ach term of the 
23db0 4f 52 20 63 6c 61 75 73 65 2e 20 20 41 66 74 65  OR clause.  Afte
23dc0 72 0a 20 20 20 20 2a 2a 20 65 6c 69 6d 69 6e 61  r.    ** elimina
23dd0 74 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 20  ting duplicates 
23de0 66 72 6f 6d 20 6f 74 68 65 72 20 57 48 45 52 45  from other WHERE
23df0 20 63 6c 61 75 73 65 73 2c 20 74 68 65 20 61 63   clauses, the ac
23e00 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 0a 20 20  tion for each.  
23e10 20 20 2a 2a 20 73 75 62 2d 57 48 45 52 45 20 63    ** sub-WHERE c
23e20 6c 61 75 73 65 20 69 73 20 74 6f 20 74 6f 20 69  lause is to to i
23e30 6e 76 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20 6c  nvoke the main l
23e40 6f 6f 70 20 62 6f 64 79 20 61 73 20 61 20 73 75  oop body as a su
23e50 62 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f  broutine..    */
23e60 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20  .    wctrlFlags 
23e70 3d 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50  =  WHERE_OMIT_OP
23e80 45 4e 5f 43 4c 4f 53 45 0a 20 20 20 20 20 20 20  EN_CLOSE.       
23e90 20 20 20 20 20 20 20 20 20 7c 20 57 48 45 52 45           | WHERE
23ea0 5f 46 4f 52 43 45 5f 54 41 42 4c 45 0a 20 20 20  _FORCE_TABLE.   
23eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 57               | W
23ec0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
23ed0 4c 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  LY.             
23ee0 20 20 20 7c 20 57 48 45 52 45 5f 4e 4f 5f 41 55     | WHERE_NO_AU
23ef0 54 4f 49 4e 44 45 58 3b 0a 20 20 20 20 66 6f 72  TOINDEX;.    for
23f00 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d  (ii=0; ii<pOrWc-
23f10 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20  >nTerm; ii++){. 
23f20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
23f30 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63  pOrTerm = &pOrWc
23f40 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69  ->a[ii];.      i
23f50 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
23f60 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20  Cursor==iCur || 
23f70 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
23f80 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30  tor & WO_AND)!=0
23f90 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
23fa0 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f  eInfo *pSubWInfo
23fb0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
23fc0 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f  nfo for single O
23fd0 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20  R-term scan */. 
23fe0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72         Expr *pOr
23ff0 45 78 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Expr = pOrTerm->
24000 70 45 78 70 72 3b 20 2f 2a 20 43 75 72 72 65 6e  pExpr; /* Curren
24010 74 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d  t OR clause term
24020 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
24030 6a 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  j1 = 0;         
24040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
24050 64 64 72 65 73 73 20 6f 66 20 6a 75 6d 70 20 6f  ddress of jump o
24060 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  peration */.    
24070 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72      if( pAndExpr
24080 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
24090 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20 45 50  erty(pOrExpr, EP
240a0 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
240b0 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
240c0 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70  ->pLeft = pOrExp
240d0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  r;.          pOr
240e0 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b  Expr = pAndExpr;
240f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24100 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
24110 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
24120 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
24130 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
24140 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
24150 30 78 66 66 66 66 2c 20 28 22 53 75 62 70 6c 61  0xffff, ("Subpla
24160 6e 20 66 6f 72 20 4f 52 2d 63 6c 61 75 73 65 3a  n for OR-clause:
24170 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 70  \n"));.        p
24180 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74  SubWInfo = sqlit
24190 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
241a0 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72  rse, pOrTab, pOr
241b0 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Expr, 0, 0,.    
241c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241e0 20 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 69 43    wctrlFlags, iC
241f0 6f 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20  ovCur);.        
24200 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66  assert( pSubWInf
24210 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  o || pParse->nEr
24220 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
24230 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
24240 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29   if( pSubWInfo )
24250 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72  {.          Wher
24260 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70 3b  eLoop *pSubLoop;
24270 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61  .          int a
24280 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 65 78 70  ddrExplain = exp
24290 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20  lainOneScan(.   
242a0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
242b0 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62  e, pOrTab, &pSub
242c0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65  WInfo->a[0], iLe
242d0 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72  vel, pLevel->iFr
242e0 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20  om, 0.          
242f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  );.          add
24300 53 63 61 6e 53 74 61 74 75 73 28 76 2c 20 70 4f  ScanStatus(v, pO
24310 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f  rTab, &pSubWInfo
24320 2d 3e 61 5b 30 5d 2c 20 61 64 64 72 45 78 70 6c  ->a[0], addrExpl
24330 61 69 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  ain);..         
24340 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
24350 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65  sub-WHERE clause
24360 20 62 6f 64 79 2e 20 20 46 69 72 73 74 20 73 6b   body.  First sk
24370 69 70 20 6f 76 65 72 0a 20 20 20 20 20 20 20 20  ip over.        
24380 20 20 2a 2a 20 64 75 70 6c 69 63 61 74 65 20 72    ** duplicate r
24390 6f 77 73 20 66 72 6f 6d 20 70 72 69 6f 72 20 73  ows from prior s
243a0 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 73  ub-WHERE clauses
243b0 2c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65  , and record the
243c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  .          ** ro
243d0 77 69 64 20 28 6f 72 20 50 52 49 4d 41 52 59 20  wid (or PRIMARY 
243e0 4b 45 59 29 20 66 6f 72 20 74 68 65 20 63 75 72  KEY) for the cur
243f0 72 65 6e 74 20 72 6f 77 20 73 6f 20 74 68 61 74  rent row so that
24400 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
24410 20 20 20 20 2a 2a 20 72 6f 77 20 77 69 6c 6c 20      ** row will 
24420 62 65 20 73 6b 69 70 70 65 64 20 69 6e 20 73 75  be skipped in su
24430 62 73 65 71 75 65 6e 74 20 73 75 62 2d 57 48 45  bsequent sub-WHE
24440 52 45 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20  RE clauses..    
24450 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
24460 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
24470 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
24480 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b  RE_DUPLICATES_OK
24490 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
244a0 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20      int r;.     
244b0 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 74 20         int iSet 
244c0 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e  = ((ii==pOrWc->n
244d0 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a  Term-1)?-1:ii);.
244e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
244f0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
24500 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
24510 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  r = sqlite3ExprC
24520 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
24530 72 73 65 2c 20 70 54 61 62 2c 20 2d 31 2c 20 69  rse, pTab, -1, i
24540 43 75 72 2c 20 72 65 67 52 6f 77 69 64 2c 20 30  Cur, regRowid, 0
24550 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
24560 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
24570 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
24580 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67  _RowSetTest, reg
24590 52 6f 77 73 65 74 2c 20 30 2c 20 72 2c 69 53 65  Rowset, 0, r,iSe
245a0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
245b0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
245c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
245d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
245e0 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d      Index *pPk =
245f0 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
24600 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
24610 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
24620 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79   nPk = pPk->nKey
24630 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
24640 20 20 20 69 6e 74 20 69 50 6b 3b 0a 0a 20 20 20     int iPk;..   
24650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
24660 61 64 20 74 68 65 20 50 4b 20 69 6e 74 6f 20 61  ad the PK into a
24670 6e 20 61 72 72 61 79 20 6f 66 20 74 65 6d 70 20  n array of temp 
24680 72 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a 20 20  registers. */.  
24690 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20              r = 
246a0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
246b0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50 6b 29  nge(pParse, nPk)
246c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
246d0 66 6f 72 28 69 50 6b 3d 30 3b 20 69 50 6b 3c 6e  for(iPk=0; iPk<n
246e0 50 6b 3b 20 69 50 6b 2b 2b 29 7b 0a 20 20 20 20  Pk; iPk++){.    
246f0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
24700 69 43 6f 6c 20 3d 20 70 50 6b 2d 3e 61 69 43 6f  iCol = pPk->aiCo
24710 6c 75 6d 6e 5b 69 50 6b 5d 3b 0a 20 20 20 20 20  lumn[iPk];.     
24720 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
24730 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
24740 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  umn(pParse, pTab
24750 2c 20 69 43 6f 6c 2c 20 69 43 75 72 2c 20 72 2b  , iCol, iCur, r+
24760 69 50 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  iPk, 0);.       
24770 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
24780 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
24790 20 69 66 20 74 68 65 20 74 65 6d 70 20 74 61 62   if the temp tab
247a0 6c 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  le already conta
247b0 69 6e 73 20 74 68 69 73 20 6b 65 79 2e 20 49 66  ins this key. If
247c0 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20   so,.           
247d0 20 20 20 2a 2a 20 74 68 65 20 72 6f 77 20 68 61     ** the row ha
247e0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  s already been i
247f0 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72  ncluded in the r
24800 65 73 75 6c 74 20 73 65 74 20 61 6e 64 0a 20 20  esult set and.  
24810 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63              ** c
24820 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 20 28 62  an be ignored (b
24830 79 20 6a 75 6d 70 69 6e 67 20 70 61 73 74 20 74  y jumping past t
24840 68 65 20 47 6f 73 75 62 20 62 65 6c 6f 77 29 2e  he Gosub below).
24850 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
24860 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73            ** ins
24870 65 72 74 20 74 68 65 20 6b 65 79 20 69 6e 74 6f  ert the key into
24880 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20   the temp table 
24890 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68  and proceed with
248a0 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
248b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
248c0 20 72 6f 77 2e 0a 20 20 20 20 20 20 20 20 20 20   row..          
248d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
248e0 20 20 20 20 20 2a 2a 20 55 73 65 20 73 6f 6d 65       ** Use some
248f0 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 70 74   of the same opt
24900 69 6d 69 7a 61 74 69 6f 6e 73 20 61 73 20 4f 50  imizations as OP
24910 5f 52 6f 77 53 65 74 54 65 73 74 3a 20 49 66 20  _RowSetTest: If 
24920 69 53 65 74 0a 20 20 20 20 20 20 20 20 20 20 20  iSet.           
24930 20 20 20 2a 2a 20 69 73 20 7a 65 72 6f 2c 20 61     ** is zero, a
24940 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6b  ssume that the k
24950 65 79 20 63 61 6e 6e 6f 74 20 61 6c 72 65 61 64  ey cannot alread
24960 79 20 62 65 20 70 72 65 73 65 6e 74 20 69 6e 0a  y be present in.
24970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
24980 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 2e   the temp table.
24990 20 41 6e 64 20 69 66 20 69 53 65 74 20 69 73 20   And if iSet is 
249a0 2d 31 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  -1, assume that 
249b0 74 68 65 72 65 20 69 73 20 6e 6f 20 0a 20 20 20  there is no .   
249c0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65             ** ne
249d0 65 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ed to insert the
249e0 20 6b 65 79 20 69 6e 74 6f 20 74 68 65 20 74 65   key into the te
249f0 6d 70 20 74 61 62 6c 65 2c 20 61 73 20 69 74 20  mp table, as it 
24a00 77 69 6c 6c 20 6e 65 76 65 72 20 0a 20 20 20 20  will never .    
24a10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
24a20 74 65 73 74 65 64 20 66 6f 72 2e 20 20 2a 2f 20  tested for.  */ 
24a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
24a40 66 28 20 69 53 65 74 20 29 7b 0a 20 20 20 20 20  f( iSet ){.     
24a50 20 20 20 20 20 20 20 20 20 20 20 6a 31 20 3d 20             j1 = 
24a60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24a70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
24a80 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 30 2c 20  , regRowset, 0, 
24a90 72 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20  r, nPk);.       
24aa0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
24ab0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
24ac0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24ad0 20 20 20 20 20 20 20 20 69 66 28 20 69 53 65 74          if( iSet
24ae0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
24af0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
24b00 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
24b10 61 6b 65 52 65 63 6f 72 64 2c 20 72 2c 20 6e 50  akeRecord, r, nP
24b20 6b 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  k, regRowid);.  
24b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
24b40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
24b50 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
24b60 20 72 65 67 52 6f 77 73 65 74 2c 20 72 65 67 52   regRowset, regR
24b70 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  owid, 0);.      
24b80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 53            if( iS
24b90 65 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  et ) sqlite3Vdbe
24ba0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
24bb0 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
24bc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
24bd0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
24be0 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
24bf0 20 61 72 72 61 79 20 6f 66 20 74 65 6d 70 20 72   array of temp r
24c00 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 20 20  egisters */.    
24c10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24c20 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
24c30 65 28 70 50 61 72 73 65 2c 20 72 2c 20 6e 50 6b  e(pParse, r, nPk
24c40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
24c50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
24c60 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b          /* Invok
24c70 65 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20  e the main loop 
24c80 62 6f 64 79 20 61 73 20 61 20 73 75 62 72 6f 75  body as a subrou
24c90 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  tine */.        
24ca0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24cb0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
24cc0 20 72 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f   regReturn, iLoo
24cd0 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20 20  pBody);..       
24ce0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
24cf0 28 73 6b 69 70 70 69 6e 67 20 74 68 65 20 6d 61  (skipping the ma
24d00 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 73 75 62  in loop body sub
24d10 72 6f 75 74 69 6e 65 29 20 69 66 20 74 68 65 0a  routine) if the.
24d20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
24d30 72 65 6e 74 20 73 75 62 2d 57 48 45 52 45 20 72  rent sub-WHERE r
24d40 6f 77 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  ow is a duplicat
24d50 65 20 66 72 6f 6d 20 70 72 69 6f 72 20 73 75 62  e from prior sub
24d60 2d 57 48 45 52 45 73 2e 20 2a 2f 0a 20 20 20 20  -WHEREs. */.    
24d70 20 20 20 20 20 20 69 66 28 20 6a 31 20 29 20 73        if( j1 ) s
24d80 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
24d90 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20  re(v, j1);..    
24da0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75        /* The pSu
24db0 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  bWInfo->untested
24dc0 54 65 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73  Terms flag means
24dd0 20 74 68 61 74 20 74 68 69 73 20 4f 52 20 74 65   that this OR te
24de0 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  rm.          ** 
24df0 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72  contained one or
24e00 20 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66   more AND term f
24e10 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74  rom a notReady t
24e20 61 62 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20  able.  The.     
24e30 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72       ** terms fr
24e40 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20  om the notReady 
24e50 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20  table could not 
24e60 62 65 20 74 65 73 74 65 64 20 61 6e 64 20 77 69  be tested and wi
24e70 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ll.          ** 
24e80 6e 65 65 64 20 74 6f 20 62 65 20 74 65 73 74 65  need to be teste
24e90 64 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20  d later..       
24ea0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
24eb0 69 66 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75  if( pSubWInfo->u
24ec0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 75  ntestedTerms ) u
24ed0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31  ntestedTerms = 1
24ee0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
24ef0 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52  If all of the OR
24f00 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73  -connected terms
24f10 20 61 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 75   are optimized u
24f20 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20  sing the same.  
24f30 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
24f40 2c 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  , and the index 
24f50 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
24f60 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20  the same cursor 
24f70 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20  number.         
24f80 20 2a 2a 20 62 79 20 65 61 63 68 20 63 61 6c 6c   ** by each call
24f90 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
24fa0 42 65 67 69 6e 28 29 20 6d 61 64 65 20 62 79 20  Begin() made by 
24fb0 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61  this loop, it ma
24fc0 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  y.          ** b
24fd0 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  e possible to us
24fe0 65 20 74 68 61 74 20 69 6e 64 65 78 20 61 73 20  e that index as 
24ff0 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
25000 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..          **. 
25010 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
25020 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
25030 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 61  e3WhereBegin() a
25040 62 6f 76 65 20 72 65 73 75 6c 74 65 64 20 69 6e  bove resulted in
25050 20 61 20 73 63 61 6e 20 74 68 61 74 0a 20 20 20   a scan that.   
25060 20 20 20 20 20 20 20 2a 2a 20 75 73 65 73 20 61         ** uses a
25070 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 69  n index, and thi
25080 73 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20  s is either the 
25090 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74  first OR-connect
250a0 65 64 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20  ed term.        
250b0 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 6f    ** processed o
250c0 72 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  r the index is t
250d0 68 65 20 73 61 6d 65 20 61 73 20 74 68 61 74 20  he same as that 
250e0 75 73 65 64 20 62 79 20 61 6c 6c 20 70 72 65 76  used by all prev
250f0 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
25100 2a 20 74 65 72 6d 73 2c 20 73 65 74 20 70 43 6f  * terms, set pCo
25110 76 20 74 6f 20 74 68 65 20 63 61 6e 64 69 64 61  v to the candida
25120 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  te covering inde
25130 78 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  x. Otherwise, se
25140 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t .          ** 
25150 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20  pCov to NULL to 
25160 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 6e 6f  indicate that no
25170 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72   candidate cover
25180 69 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a  ing index will .
25190 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
251a0 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20  available..     
251b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
251c0 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20 70 53 75    pSubLoop = pSu
251d0 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  bWInfo->a[0].pWL
251e0 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61  oop;.          a
251f0 73 73 65 72 74 28 20 28 70 53 75 62 4c 6f 6f 70  ssert( (pSubLoop
25200 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
25210 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30  E_AUTO_INDEX)==0
25220 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
25230 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46  ( (pSubLoop->wsF
25240 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
25250 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20  EXED)!=0.       
25260 20 20 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c      && (ii==0 ||
25270 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72   pSubLoop->u.btr
25280 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29  ee.pIndex==pCov)
25290 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
252a0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c  HasRowid(pTab) |
252b0 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49  | !IsPrimaryKeyI
252c0 6e 64 65 78 28 70 53 75 62 4c 6f 6f 70 2d 3e 75  ndex(pSubLoop->u
252d0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 29 0a  .btree.pIndex)).
252e0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
252f0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
25300 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d   pSubWInfo->a[0]
25310 2e 69 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75  .iIdxCur==iCovCu
25320 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
25330 20 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70   pCov = pSubLoop
25340 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
25350 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 63  ;.            wc
25360 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  trlFlags |= WHER
25370 45 5f 52 45 4f 50 45 4e 5f 49 44 58 3b 0a 20 20  E_REOPEN_IDX;.  
25380 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25390 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20             pCov 
253a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
253b0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ..          /* F
253c0 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74  inish the loop t
253d0 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74  hrough table ent
253e0 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20  ries that match 
253f0 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f  term pOrTerm. */
25400 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25410 65 33 57 68 65 72 65 45 6e 64 28 70 53 75 62 57  e3WhereEnd(pSubW
25420 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d  Info);.        }
25430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25440 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f     pLevel->u.pCo
25450 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20  vidx = pCov;.   
25460 20 69 66 28 20 70 43 6f 76 20 29 20 70 4c 65 76   if( pCov ) pLev
25470 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 43  el->iIdxCur = iC
25480 6f 76 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70  ovCur;.    if( p
25490 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20  AndExpr ){.     
254a0 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74   pAndExpr->pLeft
254b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
254c0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
254d0 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20  , pAndExpr);.   
254e0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
254f0 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52  beChangeP1(v, iR
25500 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56  etInit, sqlite3V
25510 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
25520 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
25530 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
25540 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
25550 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73  >addrBrk);.    s
25560 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
25570 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42  eLabel(v, iLoopB
25580 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ody);..    if( p
25590 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20  WInfo->nLevel>1 
255a0 29 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72  ) sqlite3StackFr
255b0 65 65 28 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a  ee(db, pOrTab);.
255c0 20 20 20 20 69 66 28 20 21 75 6e 74 65 73 74 65      if( !unteste
255d0 64 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65  dTerms ) disable
255e0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
255f0 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  rm);.  }else.#en
25600 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
25610 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
25620 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f  ON */..  {.    /
25630 2a 20 43 61 73 65 20 36 3a 20 20 54 68 65 72 65  * Case 6:  There
25640 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e   is no usable in
25650 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f  dex.  We must do
25660 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20   a complete.    
25670 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e  **          scan
25680 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
25690 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
256a0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
256b0 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f   aStep[] = { OP_
256c0 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b  Next, OP_Prev };
256d0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
256e0 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20  t u8 aStart[] = 
256f0 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f  { OP_Rewind, OP_
25700 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65  Last };.    asse
25710 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62  rt( bRev==0 || b
25720 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66  Rev==1 );.    if
25730 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 73 52 65  ( pTabItem->isRe
25740 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
25750 20 2f 2a 20 54 61 62 6c 65 73 20 6d 61 72 6b 65   /* Tables marke
25760 64 20 69 73 52 65 63 75 72 73 69 76 65 20 68 61  d isRecursive ha
25770 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ve only a single
25780 20 72 6f 77 20 74 68 61 74 20 69 73 20 73 74 6f   row that is sto
25790 72 65 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  red in.      ** 
257a0 61 20 70 73 65 75 64 6f 2d 63 75 72 73 6f 72 2e  a pseudo-cursor.
257b0 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 52 65 77    No need to Rew
257c0 69 6e 64 20 6f 72 20 4e 65 78 74 20 73 75 63 68  ind or Next such
257d0 20 63 75 72 73 6f 72 73 2e 20 2a 2f 0a 20 20 20   cursors. */.   
257e0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
257f0 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c  OP_Noop;.    }el
25800 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
25810 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65  ->op = aStep[bRe
25820 76 5d 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  v];.      pLevel
25830 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
25840 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
25850 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
25860 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b  ddOp2(v, aStart[
25870 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64  bRev], iCur, add
25880 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62  rBrk);.      Vdb
25890 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
258a0 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56  Rev==0);.      V
258b0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
258c0 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 20   bRev!=0);.     
258d0 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51   pLevel->p5 = SQ
258e0 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
258f0 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20  FULLSCAN_STEP;. 
25900 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
25910 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
25920 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
25930 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 56 69 73   pLevel->addrVis
25940 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  it = sqlite3Vdbe
25950 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
25960 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 73  #endif..  /* Ins
25970 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
25980 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73   every subexpres
25990 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65  sion that can be
259a0 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a   completely.  **
259b0 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20   computed using 
259c0 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20  the current set 
259d0 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  of tables..  */.
259e0 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
259f0 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, j=pWC->nTerm
25a00 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72  ; j>0; j--, pTer
25a10 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
25a20 70 45 3b 0a 20 20 20 20 69 6e 74 20 73 6b 69 70  pE;.    int skip
25a30 4c 69 6b 65 41 64 64 72 20 3d 20 30 3b 0a 20 20  LikeAddr = 0;.  
25a40 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
25a50 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
25a60 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
25a70 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
25a80 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
25a90 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66  _CODED );.    if
25aa0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
25ab0 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
25ac0 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
25ad0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
25ae0 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
25af0 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  ll & pLevel->not
25b00 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20  Ready)!=0 ){.   
25b10 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49     testcase( pWI
25b20 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
25b30 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ms==0.          
25b40 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
25b50 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
25b60 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
25b70 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  Y)!=0 );.      p
25b80 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
25b90 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  erms = 1;.      
25ba0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
25bb0 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e      pE = pTerm->
25bc0 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
25bd0 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20  t( pE!=0 );.    
25be0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
25bf0 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61  tJoin && !ExprHa
25c00 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
25c10 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
25c20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
25c30 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72    }.    if( pTer
25c40 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
25c50 4d 5f 4c 49 4b 45 43 4f 4e 44 20 29 7b 0a 20 20  M_LIKECOND ){.  
25c60 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
25c70 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72  el->iLikeRepCntr
25c80 3e 30 20 29 3b 0a 20 20 20 20 20 20 73 6b 69 70  >0 );.      skip
25c90 4c 69 6b 65 41 64 64 72 20 3d 20 73 71 6c 69 74  LikeAddr = sqlit
25ca0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
25cb0 4f 50 5f 49 66 4e 6f 74 2c 20 70 4c 65 76 65 6c  OP_IfNot, pLevel
25cc0 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 29 3b  ->iLikeRepCntr);
25cd0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
25ce0 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
25cf0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
25d00 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c  alse(pParse, pE,
25d10 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
25d20 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
25d30 20 20 20 69 66 28 20 73 6b 69 70 4c 69 6b 65 41     if( skipLikeA
25d40 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62  ddr ) sqlite3Vdb
25d50 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 6b 69  eJumpHere(v, ski
25d60 70 4c 69 6b 65 41 64 64 72 29 3b 0a 20 20 20 20  pLikeAddr);.    
25d70 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
25d80 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
25d90 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63  }..  /* Insert c
25da0 6f 64 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20  ode to test for 
25db0 69 6d 70 6c 69 65 64 20 63 6f 6e 73 74 72 61 69  implied constrai
25dc0 6e 74 73 20 62 61 73 65 64 20 6f 6e 20 74 72 61  nts based on tra
25dd0 6e 73 69 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f  nsitivity.  ** o
25de0 66 20 74 68 65 20 22 3d 3d 22 20 6f 70 65 72 61  f the "==" opera
25df0 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  tor..  **.  ** E
25e00 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 57  xample: If the W
25e10 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
25e20 61 69 6e 73 20 22 74 31 2e 61 3d 74 32 2e 62 22  ains "t1.a=t2.b"
25e30 20 61 6e 64 20 22 74 32 2e 62 3d 31 32 33 22 0a   and "t2.b=123".
25e40 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20    ** and we are 
25e50 63 6f 64 69 6e 67 20 74 68 65 20 74 31 20 6c 6f  coding the t1 lo
25e60 6f 70 20 61 6e 64 20 74 68 65 20 74 32 20 6c 6f  op and the t2 lo
25e70 6f 70 20 68 61 73 20 6e 6f 74 20 79 65 74 20 63  op has not yet c
25e80 6f 64 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  oded,.  ** then 
25e90 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 74 68  we cannot use th
25ea0 65 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f  e "t1.a=t2.b" co
25eb0 6e 73 74 72 61 69 6e 74 2c 20 62 75 74 20 77 65  nstraint, but we
25ec0 20 63 61 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74   can code.  ** t
25ed0 68 65 20 69 6d 70 6c 69 65 64 20 22 74 31 2e 61  he implied "t1.a
25ee0 3d 31 32 33 22 20 63 6f 6e 73 74 72 61 69 6e 74  =123" constraint
25ef0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65  ..  */.  for(pTe
25f00 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43  rm=pWC->a, j=pWC
25f10 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d  ->nTerm; j>0; j-
25f20 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
25f30 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 45 41 6c   Expr *pE, *pEAl
25f40 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  t;.    WhereTerm
25f50 20 2a 70 41 6c 74 3b 0a 20 20 20 20 69 66 28 20   *pAlt;.    if( 
25f60 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
25f70 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
25f80 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
25f90 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
25fa0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
25fb0 3d 28 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51  =(WO_EQUIV|WO_EQ
25fc0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
25fd0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
25fe0 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29 20  tCursor!=iCur ) 
25ff0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
26000 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
26010 6f 69 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  oin ) continue;.
26020 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e      pE = pTerm->
26030 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
26040 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
26050 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a  rty(pE, EP_FromJ
26060 6f 69 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65  oin) );.    asse
26070 72 74 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  rt( (pTerm->prer
26080 65 71 52 69 67 68 74 20 26 20 70 4c 65 76 65 6c  eqRight & pLevel
26090 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  ->notReady)!=0 )
260a0 3b 0a 20 20 20 20 70 41 6c 74 20 3d 20 66 69 6e  ;.    pAlt = fin
260b0 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
260c0 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
260d0 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20  lumn, notReady, 
260e0 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b  WO_EQ|WO_IN, 0);
260f0 0a 20 20 20 20 69 66 28 20 70 41 6c 74 3d 3d 30  .    if( pAlt==0
26100 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
26110 20 69 66 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61   if( pAlt->wtFla
26120 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 44 45 44  gs & (TERM_CODED
26130 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
26140 20 20 74 65 73 74 63 61 73 65 28 20 70 41 6c 74    testcase( pAlt
26150 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
26160 5f 45 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _EQ );.    testc
26170 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72  ase( pAlt->eOper
26180 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
26190 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f      VdbeModuleCo
261a0 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e  mment((v, "begin
261b0 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73   transitive cons
261c0 74 72 61 69 6e 74 22 29 29 3b 0a 20 20 20 20 70  traint"));.    p
261d0 45 41 6c 74 20 3d 20 73 71 6c 69 74 65 33 53 74  EAlt = sqlite3St
261e0 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 20  ackAllocRaw(db, 
261f0 73 69 7a 65 6f 66 28 2a 70 45 41 6c 74 29 29 3b  sizeof(*pEAlt));
26200 0a 20 20 20 20 69 66 28 20 70 45 41 6c 74 20 29  .    if( pEAlt )
26210 7b 0a 20 20 20 20 20 20 2a 70 45 41 6c 74 20 3d  {.      *pEAlt =
26220 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20   *pAlt->pExpr;. 
26230 20 20 20 20 20 70 45 41 6c 74 2d 3e 70 4c 65 66       pEAlt->pLef
26240 74 20 3d 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20  t = pE->pLeft;. 
26250 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26260 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
26270 70 45 41 6c 74 2c 20 61 64 64 72 43 6f 6e 74 2c  pEAlt, addrCont,
26280 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
26290 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
262a0 65 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20  e3StackFree(db, 
262b0 70 45 41 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pEAlt);.    }.  
262c0 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45  }..  /* For a LE
262d0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67  FT OUTER JOIN, g
262e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
262f0 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68  t will record th
26300 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a  e fact that.  **
26310 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f   at least one ro
26320 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  w of the right t
26330 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64  able has matched
26340 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e   the left table.
26350 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c    .  */.  if( pL
26360 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
26370 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  ){.    pLevel->a
26380 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74  ddrFirst = sqlit
26390 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
263a0 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
263b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
263c0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c  P_Integer, 1, pL
263d0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
263e0 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
263f0 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45  t((v, "record LE
26400 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a  FT JOIN hit"));.
26410 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
26420 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
26430 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  );.    for(pTerm
26440 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c  =pWC->a, j=0; j<
26450 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  pWC->nTerm; j++,
26460 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
26470 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
26480 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
26490 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
264a0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
264b0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
264c0 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20  M_CODED );.     
264d0 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
264e0 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
264f0 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
26500 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
26510 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
26520 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c  ereqAll & pLevel
26530 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  ->notReady)!=0 )
26540 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
26550 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
26560 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20  edTerms );.     
26570 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
26580 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
26590 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  t( pTerm->pExpr 
265a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
265b0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
265c0 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
265d0 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
265e0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
265f0 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
26600 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
26610 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ED;.    }.  }.. 
26620 20 72 65 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e   return pLevel->
26630 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66  notReady;.}..#if
26640 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
26650 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69  NABLED./*.** Pri
26660 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  nt the content o
26670 66 20 61 20 57 68 65 72 65 54 65 72 6d 20 6f 62  f a WhereTerm ob
26680 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
26690 6f 69 64 20 77 68 65 72 65 54 65 72 6d 50 72 69  oid whereTermPri
266a0 6e 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54  nt(WhereTerm *pT
266b0 65 72 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b  erm, int iTerm){
266c0 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20  .  if( pTerm==0 
266d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
266e0 62 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d  bugPrintf("TERM-
266f0 25 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54  %-3d NULL\n", iT
26700 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erm);.  }else{. 
26710 20 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d     char zType[4]
26720 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79  ;.    memcpy(zTy
26730 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20  pe, "...", 4);. 
26740 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
26750 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
26760 54 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20  TUAL ) zType[0] 
26770 3d 20 27 56 27 3b 0a 20 20 20 20 69 66 28 20 70  = 'V';.    if( p
26780 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
26790 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54  & WO_EQUIV  ) zT
267a0 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20  ype[1] = 'E';.  
267b0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
267c0 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
267d0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
267e0 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c   ) zType[2] = 'L
267f0 27 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ';.    sqlite3De
26800 62 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d  bugPrintf("TERM-
26810 25 2d 33 64 20 25 70 20 25 73 20 63 75 72 73 6f  %-3d %p %s curso
26820 72 3d 25 2d 33 64 20 70 72 6f 62 3d 25 2d 33 64  r=%-3d prob=%-3d
26830 20 6f 70 3d 30 78 25 30 33 78 5c 6e 22 2c 0a 20   op=0x%03x\n",. 
26840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26850 20 20 20 20 20 20 69 54 65 72 6d 2c 20 70 54 65        iTerm, pTe
26860 72 6d 2c 20 7a 54 79 70 65 2c 20 70 54 65 72 6d  rm, zType, pTerm
26870 2d 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54  ->leftCursor, pT
26880 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a  erm->truthProb,.
26890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268a0 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f         pTerm->eO
268b0 70 65 72 61 74 6f 72 29 3b 0a 20 20 20 20 73 71  perator);.    sq
268c0 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
268d0 72 28 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  r(0, pTerm->pExp
268e0 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  r, 0);.  }.}.#en
268f0 64 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52  dif..#ifdef WHER
26900 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
26910 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65  *.** Print a Whe
26920 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f  reLoop object fo
26930 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70  r debugging purp
26940 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oses.*/.static v
26950 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69  oid whereLoopPri
26960 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  nt(WhereLoop *p,
26970 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
26980 43 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  C){.  WhereInfo 
26990 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70  *pWInfo = pWC->p
269a0 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20  WInfo;.  int nb 
269b0 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61  = 1+(pWInfo->pTa
269c0 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38  bList->nSrc+7)/8
269d0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
269e0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
269f0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
26a00 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a  t->a + p->iTab;.
26a10 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
26a20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73  pItem->pTab;.  s
26a30 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
26a40 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e  f("%c%2d.%0*llx.
26a50 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c  %0*llx", p->cId,
26a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26a70 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e        p->iTab, n
26a80 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20  b, p->maskSelf, 
26a90 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a  nb, p->prereq);.
26aa0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
26ab0 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20  intf(" %12s",.  
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ad0 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
26ae0 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73   ? pItem->zAlias
26af0 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b   : pTab->zName);
26b00 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  .  if( (p->wsFla
26b10 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
26b20 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20  ALTABLE)==0 ){. 
26b30 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
26b40 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  Name;.    if( p-
26b50 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
26b60 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75  && (zName = p->u
26b70 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
26b80 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
26b90 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e    if( strncmp(zN
26ba0 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  ame, "sqlite_aut
26bb0 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30  oindex_", 17)==0
26bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
26bd0 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
26be0 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a  n30(zName) - 1;.
26bf0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
26c00 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69  Name[i]!='_' ) i
26c10 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  --;.        zNam
26c20 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a  e += i;.      }.
26c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
26c40 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73  ugPrintf(".%-16s
26c50 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d   %2d", zName, p-
26c60 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20  >u.btree.nEq);. 
26c70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26c80 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26c90 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20  tf("%20s","");. 
26ca0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
26cb0 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69    char *z;.    i
26cc0 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  f( p->u.vtab.idx
26cd0 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  Str ){.      z =
26ce0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
26cf0 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29  ("(%d,\"%s\",%x)
26d00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
26d10 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78     p->u.vtab.idx
26d20 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  Num, p->u.vtab.i
26d30 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62  dxStr, p->u.vtab
26d40 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
26d50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d  }else{.      z =
26d60 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
26d70 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75  ("(%d,%x)", p->u
26d80 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
26d90 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
26da0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
26db0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
26dc0 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20  " %-19s", z);.  
26dd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
26de0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
26df0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
26e00 53 4b 49 50 53 43 41 4e 20 29 7b 0a 20 20 20 20  SKIPSCAN ){.    
26e10 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26e20 74 66 28 22 20 66 20 25 30 35 78 20 25 64 2d 25  tf(" f %05x %d-%
26e30 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20  d", p->wsFlags, 
26e40 70 2d 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b  p->nLTerm,p->nSk
26e50 69 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ip);.  }else{.  
26e60 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
26e70 69 6e 74 66 28 22 20 66 20 25 30 35 78 20 4e 20  intf(" f %05x N 
26e80 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c  %d", p->wsFlags,
26e90 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d   p->nLTerm);.  }
26ea0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
26eb0 72 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c  rintf(" cost %d,
26ec0 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65  %d,%d\n", p->rSe
26ed0 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d  tup, p->rRun, p-
26ee0 3e 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20 70 2d  >nOut);.  if( p-
26ef0 3e 6e 4c 54 65 72 6d 20 26 26 20 28 73 71 6c 69  >nLTerm && (sqli
26f00 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
26f10 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20  0x100)!=0 ){.   
26f20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
26f30 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d  i=0; i<p->nLTerm
26f40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68  ; i++){.      wh
26f50 65 72 65 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e  ereTermPrint(p->
26f60 61 4c 54 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20  aLTerm[i], i);. 
26f70 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
26f80 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
26f90 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74   bulk memory int
26fa0 6f 20 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c  o a valid WhereL
26fb0 6f 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65 20  oop that can be 
26fc0 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65  passed.** to whe
26fd0 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d  reLoopClear harm
26fe0 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  lessly..*/.stati
26ff0 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
27000 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a  Init(WhereLoop *
27010 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20  p){.  p->aLTerm 
27020 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  = p->aLTermSpace
27030 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  ;.  p->nLTerm = 
27040 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d  0;.  p->nLSlot =
27050 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c   ArraySize(p->aL
27060 54 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d  TermSpace);.  p-
27070 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a  >wsFlags = 0;.}.
27080 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
27090 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69   WhereLoop.u uni
270a0 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65  on.  Leave Where
270b0 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61  Loop.pLTerm inta
270c0 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
270d0 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  id whereLoopClea
270e0 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  rUnion(sqlite3 *
270f0 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
27100 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c  ){.  if( p->wsFl
27110 61 67 73 20 26 20 28 57 48 45 52 45 5f 56 49 52  ags & (WHERE_VIR
27120 54 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f  TUALTABLE|WHERE_
27130 41 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20  AUTO_INDEX) ){. 
27140 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
27150 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
27160 41 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70  ALTABLE)!=0 && p
27170 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
27180 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
27190 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61  e3_free(p->u.vta
271a0 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  b.idxStr);.     
271b0 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46   p->u.vtab.needF
271c0 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ree = 0;.      p
271d0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
271e0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
271f0 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
27200 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
27210 58 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74  X)!=0 && p->u.bt
27220 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b  ree.pIndex!=0 ){
27230 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
27240 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74  Free(db, p->u.bt
27250 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c  ree.pIndex->zCol
27260 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Aff);.      sqli
27270 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
27280 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
27290 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  ;.      p->u.btr
272a0 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
272b0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
272c0 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74  * Deallocate int
272d0 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65  ernal memory use
272e0 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70  d by a WhereLoop
272f0 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
27300 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
27310 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
27320 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
27330 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  {.  if( p->aLTer
27340 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
27350 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
27360 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
27370 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  ;.  whereLoopCle
27380 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a  arUnion(db, p);.
27390 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
273a0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  p);.}../*.** Inc
273b0 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  rease the memory
273c0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20   allocation for 
273d0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20  pLoop->aLTerm[] 
273e0 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e  to be at least n
273f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27400 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
27410 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
27420 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e  reLoop *p, int n
27430 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
27440 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d  *paNew;.  if( p-
27450 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74  >nLSlot>=n ) ret
27460 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
27470 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20   n = (n+7)&~7;. 
27480 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   paNew = sqlite3
27490 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
274a0 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
274b0 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70  [0])*n);.  if( p
274c0 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
274d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
274e0 20 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c 20 70   memcpy(paNew, p
274f0 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66  ->aLTerm, sizeof
27500 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70  (p->aLTerm[0])*p
27510 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28  ->nLSlot);.  if(
27520 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
27530 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
27540 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
27550 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e  ->aLTerm);.  p->
27560 61 4c 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a  aLTerm = paNew;.
27570 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b    p->nLSlot = n;
27580 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27590 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
275a0 61 6e 73 66 65 72 20 63 6f 6e 74 65 6e 74 20 66  ansfer content f
275b0 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 70  rom the second p
275c0 4c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 66 69  Loop into the fi
275d0 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rst..*/.static i
275e0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72  nt whereLoopXfer
275f0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
27600 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68  ereLoop *pTo, Wh
27610 65 72 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b  ereLoop *pFrom){
27620 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
27630 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b  rUnion(db, pTo);
27640 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  .  if( whereLoop
27650 52 65 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20  Resize(db, pTo, 
27660 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29  pFrom->nLTerm) )
27670 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 54  {.    memset(&pT
27680 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28  o->u, 0, sizeof(
27690 70 54 6f 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65  pTo->u));.    re
276a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
276b0 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  M;.  }.  memcpy(
276c0 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52  pTo, pFrom, WHER
276d0 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b  E_LOOP_XFER_SZ);
276e0 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61  .  memcpy(pTo->a
276f0 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c  LTerm, pFrom->aL
27700 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72  Term, pTo->nLTer
27710 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c  m*sizeof(pTo->aL
27720 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28  Term[0]));.  if(
27730 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20   pFrom->wsFlags 
27740 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
27750 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f  ABLE ){.    pFro
27760 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  m->u.vtab.needFr
27770 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ee = 0;.  }else 
27780 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c  if( (pFrom->wsFl
27790 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
277a0 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
277b0 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65    pFrom->u.btree
277c0 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d  .pIndex = 0;.  }
277d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
277e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
277f0 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lete a WhereLoop
27800 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
27810 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
27820 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
27830 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
27840 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  ){.  whereLoopCl
27850 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71  ear(db, p);.  sq
27860 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
27870 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  p);.}../*.** Fre
27880 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74  e a WhereInfo st
27890 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69  ructure.*/.stati
278a0 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f  c void whereInfo
278b0 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62  Free(sqlite3 *db
278c0 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  , WhereInfo *pWI
278d0 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  nfo){.  if( ALWA
278e0 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  YS(pWInfo) ){.  
278f0 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
27900 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  ar(&pWInfo->sWC)
27910 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49  ;.    while( pWI
27920 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20  nfo->pLoops ){. 
27930 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
27940 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  p = pWInfo->pLoo
27950 70 73 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ps;.      pWInfo
27960 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e  ->pLoops = p->pN
27970 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77  extLoop;.      w
27980 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64  hereLoopDelete(d
27990 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  b, p);.    }.   
279a0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 62 53 68   if( pWInfo->bSh
279b0 6f 72 74 63 75 74 20 29 7b 0a 20 20 20 20 20 20  ortcut ){.      
279c0 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64  whereLoopClear(d
279d0 62 2c 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  b, pWInfo->a[0].
279e0 70 57 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  pWLoop);.    }. 
279f0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
27a00 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
27a10 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
27a20 6e 20 54 52 55 45 20 69 66 20 61 6c 6c 20 6f 66  n TRUE if all of
27a30 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
27a40 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
27a50 20 28 31 29 20 20 58 20 68 61 73 20 74 68 65 20   (1)  X has the 
27a60 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f  same or lower co
27a70 73 74 20 74 68 61 74 20 59 0a 2a 2a 20 20 20 28  st that Y.**   (
27a80 32 29 20 20 58 20 69 73 20 61 20 70 72 6f 70 65  2)  X is a prope
27a90 72 20 73 75 62 73 65 74 20 6f 66 20 59 0a 2a 2a  r subset of Y.**
27aa0 20 20 20 28 33 29 20 20 58 20 73 6b 69 70 73 20     (3)  X skips 
27ab0 61 74 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79  at least as many
27ac0 20 63 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a 2a   columns as Y.**
27ad0 0a 2a 2a 20 42 79 20 22 70 72 6f 70 65 72 20 73  .** By "proper s
27ae0 75 62 73 65 74 22 20 77 65 20 6d 65 61 6e 20 74  ubset" we mean t
27af0 68 61 74 20 58 20 75 73 65 73 20 66 65 77 65 72  hat X uses fewer
27b00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
27b10 72 6d 73 0a 2a 2a 20 74 68 61 6e 20 59 20 61 6e  rms.** than Y an
27b20 64 20 74 68 61 74 20 65 76 65 72 79 20 57 48 45  d that every WHE
27b30 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75  RE clause term u
27b40 73 65 64 20 62 79 20 58 20 69 73 20 61 6c 73 6f  sed by X is also
27b50 20 75 73 65 64 0a 2a 2a 20 62 79 20 59 2e 0a 2a   used.** by Y..*
27b60 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70  *.** If X is a p
27b70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
27b80 59 20 74 68 65 6e 20 59 20 69 73 20 61 20 62 65  Y then Y is a be
27b90 74 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20  tter choice and 
27ba0 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65  ought.** to have
27bb0 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20   a lower cost.  
27bc0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
27bd0 75 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74  urns TRUE when t
27be0 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c  hat cost .** rel
27bf0 61 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76  ationship is inv
27c00 65 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20  erted and needs 
27c10 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e 20  to be adjusted. 
27c20 20 54 68 65 20 74 68 69 72 64 20 72 75 6c 65 0a   The third rule.
27c30 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63  ** was added bec
27c40 61 75 73 65 20 69 66 20 58 20 75 73 65 73 20 73  ause if X uses s
27c50 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73 20 74 68  kip-scan less th
27c60 61 6e 20 59 20 69 74 20 73 74 69 6c 6c 20 6d 69  an Y it still mi
27c70 67 68 74 0a 2a 2a 20 64 65 73 65 72 76 65 20 61  ght.** deserve a
27c80 20 6c 6f 77 65 72 20 63 6f 73 74 20 65 76 65 6e   lower cost even
27c90 20 69 66 20 69 74 20 69 73 20 61 20 70 72 6f 70   if it is a prop
27ca0 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 2e 0a  er subset of Y..
27cb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
27cc0 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72  ereLoopCheaperPr
27cd0 6f 70 65 72 53 75 62 73 65 74 28 0a 20 20 63 6f  operSubset(.  co
27ce0 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
27cf0 58 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  X,       /* Firs
27d00 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 63  t WhereLoop to c
27d10 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  ompare */.  cons
27d20 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 59 20  t WhereLoop *pY 
27d30 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
27d40 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 57  e against this W
27d50 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  hereLoop */.){. 
27d60 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28   int i, j;.  if(
27d70 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70 58 2d 3e   pX->nLTerm-pX->
27d80 6e 53 6b 69 70 20 3e 3d 20 70 59 2d 3e 6e 4c 54  nSkip >= pY->nLT
27d90 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70 20 29 7b  erm-pY->nSkip ){
27da0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
27db0 2a 20 58 20 69 73 20 6e 6f 74 20 61 20 73 75 62  * X is not a sub
27dc0 73 65 74 20 6f 66 20 59 20 2a 2f 0a 20 20 7d 0a  set of Y */.  }.
27dd0 20 20 69 66 28 20 70 59 2d 3e 6e 53 6b 69 70 20    if( pY->nSkip 
27de0 3e 20 70 58 2d 3e 6e 53 6b 69 70 20 29 20 72 65  > pX->nSkip ) re
27df0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 58  turn 0;.  if( pX
27e00 2d 3e 72 52 75 6e 20 3e 3d 20 70 59 2d 3e 72 52  ->rRun >= pY->rR
27e10 75 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 58  un ){.    if( pX
27e20 2d 3e 72 52 75 6e 20 3e 20 70 59 2d 3e 72 52 75  ->rRun > pY->rRu
27e30 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  n ) return 0;   
27e40 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65   /* X costs more
27e50 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 20 20 69   than Y */.    i
27e60 66 28 20 70 58 2d 3e 6e 4f 75 74 20 3e 20 70 59  f( pX->nOut > pY
27e70 2d 3e 6e 4f 75 74 20 29 20 72 65 74 75 72 6e 20  ->nOut ) return 
27e80 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73  0;    /* X costs
27e90 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a   more than Y */.
27ea0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 58 2d 3e    }.  for(i=pX->
27eb0 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  nLTerm-1; i>=0; 
27ec0 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 70 58  i--){.    if( pX
27ed0 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29  ->aLTerm[i]==0 )
27ee0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
27ef0 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d  or(j=pY->nLTerm-
27f00 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
27f10 20 20 20 20 20 69 66 28 20 70 59 2d 3e 61 4c 54       if( pY->aLT
27f20 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65  erm[j]==pX->aLTe
27f30 72 6d 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20  rm[i] ) break;. 
27f40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30     }.    if( j<0
27f50 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
27f60 20 58 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20   X not a subset 
27f70 6f 66 20 59 20 73 69 6e 63 65 20 74 65 72 6d 20  of Y since term 
27f80 58 5b 69 5d 20 6e 6f 74 20 75 73 65 64 20 62 79  X[i] not used by
27f90 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75   Y */.  }.  retu
27fa0 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63 6f  rn 1;  /* All co
27fb0 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a 2f  nditions meet */
27fc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
27fd0 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74   adjust the cost
27fe0 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 70 54   of WhereLoop pT
27ff0 65 6d 70 6c 61 74 65 20 75 70 77 61 72 64 73 20  emplate upwards 
28000 6f 72 20 64 6f 77 6e 77 61 72 64 73 20 73 6f 0a  or downwards so.
28010 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  ** that:.**.**  
28020 20 28 31 29 20 70 54 65 6d 70 6c 61 74 65 20 63   (1) pTemplate c
28030 6f 73 74 73 20 6c 65 73 73 20 74 68 61 6e 20 61  osts less than a
28040 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f  ny other WhereLo
28050 6f 70 73 20 74 68 61 74 20 61 72 65 20 61 20 70  ops that are a p
28060 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20 20 20 73  roper.**       s
28070 75 62 73 65 74 20 6f 66 20 70 54 65 6d 70 6c 61  ubset of pTempla
28080 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 70  te.**.**   (2) p
28090 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6d  Template costs m
280a0 6f 72 65 20 74 68 61 6e 20 61 6e 79 20 6f 74 68  ore than any oth
280b0 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 6f  er WhereLoops fo
280c0 72 20 77 68 69 63 68 20 70 54 65 6d 70 6c 61 74  r which pTemplat
280d0 65 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61 20  e.**       is a 
280e0 70 72 6f 70 65 72 20 73 75 62 73 65 74 2e 0a 2a  proper subset..*
280f0 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22 57 68 65  *.** To say "Whe
28100 72 65 4c 6f 6f 70 20 58 20 69 73 20 61 20 70 72  reLoop X is a pr
28110 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
28120 22 20 6d 65 61 6e 73 20 74 68 61 74 20 58 20 75  " means that X u
28130 73 65 73 20 66 65 77 65 72 0a 2a 2a 20 57 48 45  ses fewer.** WHE
28140 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
28150 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20  than Y and that 
28160 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75  every WHERE clau
28170 73 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20  se term used by 
28180 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73 65  X is.** also use
28190 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74 61 74 69  d by Y..*/.stati
281a0 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
281b0 41 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73 74  AdjustCost(const
281c0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57   WhereLoop *p, W
281d0 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c  hereLoop *pTempl
281e0 61 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54 65  ate){.  if( (pTe
281f0 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20  mplate->wsFlags 
28200 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
28210 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
28220 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  for(; p; p=p->pN
28230 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69 66  extLoop){.    if
28240 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70  ( p->iTab!=pTemp
28250 6c 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f 6e  late->iTab ) con
28260 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
28270 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
28280 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29  RE_INDEXED)==0 )
28290 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
282a0 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61  f( whereLoopChea
282b0 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28  perProperSubset(
282c0 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 20 29 7b  p, pTemplate) ){
282d0 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74  .      /* Adjust
282e0 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20   pTemplate cost 
282f0 64 6f 77 6e 77 61 72 64 20 73 6f 20 74 68 61 74  downward so that
28300 20 69 74 20 69 73 20 63 68 65 61 70 65 72 20 74   it is cheaper t
28310 68 61 6e 20 69 74 73 20 0a 20 20 20 20 20 20 2a  han its .      *
28320 2a 20 73 75 62 73 65 74 20 70 2e 20 2a 2f 0a 20  * subset p. */. 
28330 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
28340 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f  0x80,("subset co
28350 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64  st adjustment %d
28360 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c  ,%d to %d,%d\n",
28370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28380 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74          pTemplat
28390 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61  e->rRun, pTempla
283a0 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75  te->nOut, p->rRu
283b0 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b 0a  n, p->nOut-1));.
283c0 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
283d0 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b  >rRun = p->rRun;
283e0 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
283f0 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74  ->nOut = p->nOut
28400 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   - 1;.    }else 
28410 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  if( whereLoopChe
28420 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
28430 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 29 20 29  (pTemplate, p) )
28440 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
28450 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  t pTemplate cost
28460 20 75 70 77 61 72 64 20 73 6f 20 74 68 61 74 20   upward so that 
28470 69 74 20 69 73 20 63 6f 73 74 6c 69 65 72 20 74  it is costlier t
28480 68 61 6e 20 70 20 73 69 6e 63 65 0a 20 20 20 20  han p since.    
28490 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20 69    ** pTemplate i
284a0 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
284b0 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20 20  t of p */.      
284c0 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30 2c  WHERETRACE(0x80,
284d0 28 22 73 75 62 73 65 74 20 63 6f 73 74 20 61 64  ("subset cost ad
284e0 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74  justment %d,%d t
284f0 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20  o %d,%d\n",.    
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28510 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52     pTemplate->rR
28520 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  un, pTemplate->n
28530 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d  Out, p->rRun, p-
28540 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20 20 20 20  >nOut+1));.     
28550 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
28560 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20   = p->rRun;.    
28570 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75    pTemplate->nOu
28580 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31 3b  t = p->nOut + 1;
28590 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
285a0 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 6c  .** Search the l
285b0 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ist of WhereLoop
285c0 73 20 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f 6f  s in *ppPrev loo
285d0 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68 61  king for one tha
285e0 74 20 63 61 6e 20 62 65 0a 2a 2a 20 73 75 70 70  t can be.** supp
285f0 6c 61 6e 74 65 64 20 62 79 20 70 54 65 6d 70 6c  lanted by pTempl
28600 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ate..**.** Retur
28610 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 57 68  n NULL if the Wh
28620 65 72 65 4c 6f 6f 70 20 6c 69 73 74 20 63 6f 6e  ereLoop list con
28630 74 61 69 6e 73 20 61 6e 20 65 6e 74 72 79 20 74  tains an entry t
28640 68 61 74 20 63 61 6e 20 73 75 70 70 6c 61 6e 74  hat can supplant
28650 0a 2a 2a 20 70 54 65 6d 70 6c 61 74 65 2c 20 69  .** pTemplate, i
28660 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66  n other words if
28670 20 70 54 65 6d 70 6c 61 74 65 20 64 6f 65 73 20   pTemplate does 
28680 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e 20 74 68  not belong on th
28690 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  e list..**.** If
286a0 20 70 58 20 69 73 20 61 20 57 68 65 72 65 4c 6f   pX is a WhereLo
286b0 6f 70 20 74 68 61 74 20 70 54 65 6d 70 6c 61 74  op that pTemplat
286c0 65 20 63 61 6e 20 73 75 70 70 6c 61 6e 74 2c 20  e can supplant, 
286d0 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a  then return the.
286e0 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f 69  ** link that poi
286f0 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a  nts to pX..**.**
28700 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 63 61   If pTemplate ca
28710 6e 6e 6f 74 20 73 75 70 70 6c 61 6e 74 20 61 6e  nnot supplant an
28720 79 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d 65  y existing eleme
28730 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20 62  nt of the list b
28740 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62  ut needs.** to b
28750 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c  e added to the l
28760 69 73 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ist, then return
28770 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
28780 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 6c 69  e tail of the li
28790 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  st..*/.static Wh
287a0 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65 4c  ereLoop **whereL
287b0 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 0a 20  oopFindLesser(. 
287c0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50   WhereLoop **ppP
287d0 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68 65  rev,.  const Whe
287e0 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74  reLoop *pTemplat
287f0 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  e.){.  WhereLoop
28800 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a 70   *p;.  for(p=(*p
28810 70 50 72 65 76 29 3b 20 70 3b 20 70 70 50 72 65  pPrev); p; ppPre
28820 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c  v=&p->pNextLoop,
28830 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20   p=*ppPrev){.   
28840 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54   if( p->iTab!=pT
28850 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c  emplate->iTab ||
28860 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54   p->iSortIdx!=pT
28870 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64  emplate->iSortId
28880 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  x ){.      /* If
28890 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61 62   either the iTab
288a0 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c   or iSortIdx val
288b0 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72  ues for two Wher
288c0 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72  eLoop are differ
288d0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ent.      ** the
288e0 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f  n those WhereLoo
288f0 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f  ps need to be co
28900 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61 74  nsidered separat
28910 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73  ely.  Neither is
28920 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64  .      ** a cand
28930 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65  idate to replace
28940 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20   the other. */. 
28950 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
28960 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74     }.    /* In t
28970 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
28980 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72  mentation, the r
28990 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20 65  Setup value is e
289a0 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a  ither zero.    *
289b0 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66  * or the cost of
289c0 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74   building an aut
289d0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c  omatic index (Nl
289e0 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f  ogN) and the Nlo
289f0 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  gN.    ** is the
28a00 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74   same for compat
28a10 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e  ible WhereLoops.
28a20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
28a30 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20  p->rSetup==0 || 
28a40 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
28a50 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  p==0 .          
28a60 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65         || p->rSe
28a70 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup==pTemplate->
28a80 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f  rSetup );..    /
28a90 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  * whereLoopAddBt
28aa0 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e  ree() always gen
28ab0 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72  erates and inser
28ac0 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ts the automatic
28ad0 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61   index.    ** ca
28ae0 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65  se first.  Hence
28af0 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64   compatible cand
28b00 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73  idate WhereLoops
28b10 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c 61   never have a la
28b20 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74  rger.    ** rSet
28b30 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45  up. Call this SE
28b40 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f  TUP-INVARIANT */
28b50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
28b60 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74  rSetup>=pTemplat
28b70 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
28b80 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75 73    /* Any loop us
28b90 69 6e 67 20 61 6e 20 61 70 70 6c 69 61 74 69 6f  ing an appliatio
28ba0 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64 65 78 20  n-defined index 
28bb0 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20  (or PRIMARY KEY 
28bc0 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55 45  or.    ** UNIQUE
28bd0 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 77 69 74   constraint) wit
28be0 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d 3d  h one or more ==
28bf0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20   constraints is 
28c00 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  better.    ** th
28c10 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  an an automatic 
28c20 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73 20 69 74  index. Unless it
28c30 20 69 73 20 61 20 73 6b 69 70 2d 73 63 61 6e 2e   is a skip-scan.
28c40 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   */.    if( (p->
28c50 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
28c60 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a 20  AUTO_INDEX)!=0. 
28c70 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74      && (pTemplat
28c80 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20 20 20  e->nSkip)==0.   
28c90 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d    && (pTemplate-
28ca0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
28cb0 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20  _INDEXED)!=0.   
28cc0 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d    && (pTemplate-
28cd0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
28ce0 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a 20  _COLUMN_EQ)!=0. 
28cf0 20 20 20 20 26 26 20 28 70 2d 3e 70 72 65 72 65      && (p->prere
28d00 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
28d10 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74  rereq)==pTemplat
28d20 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 29 7b  e->prereq.    ){
28d30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
28d40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65    }..    /* If e
28d50 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
28d60 70 20 70 20 69 73 20 62 65 74 74 65 72 20 74 68  p p is better th
28d70 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70 54  an pTemplate, pT
28d80 65 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a 20  emplate can be. 
28d90 20 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64 2e     ** discarded.
28da0 20 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73    WhereLoop p is
28db0 20 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20 20   better if:.    
28dc0 2a 2a 20 20 20 28 31 29 20 20 70 20 68 61 73 20  **   (1)  p has 
28dd0 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e  no more dependen
28de0 63 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70 6c  cies than pTempl
28df0 61 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ate, and.    ** 
28e00 20 20 28 32 29 20 20 70 20 68 61 73 20 61 6e 20    (2)  p has an 
28e10 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63  equal or lower c
28e20 6f 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ost than pTempla
28e30 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  te.    */.    if
28e40 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
28e50 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
28e60 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20 20  )==p->prereq    
28e70 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20  /* (1)  */.     
28e80 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54  && p->rSetup<=pT
28e90 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28eb0 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20   /* (2a) */.    
28ec0 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65   && p->rRun<=pTe
28ed0 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20  mplate->rRun    
28ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ef0 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20    /* (2b) */.   
28f00 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54    && p->nOut<=pT
28f10 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20  emplate->nOut   
28f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f30 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20     /* (2c) */.  
28f40 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
28f50 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72 64  n 0;  /* Discard
28f60 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
28f70 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70    }..    /* If p
28f80 54 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77 61  Template is alwa
28f90 79 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70  ys better than p
28fa0 2c 20 74 68 65 6e 20 63 61 75 73 65 20 70 20 74  , then cause p t
28fb0 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  o be overwritten
28fc0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54 65  .    ** with pTe
28fd0 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c 61  mplate.  pTempla
28fe0 74 65 20 69 73 20 62 65 74 74 65 72 20 74 68 61  te is better tha
28ff0 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20  n p if:.    **  
29000 20 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65 20   (1)  pTemplate 
29010 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65  has no more depe
29020 6e 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c 20  ndences than p, 
29030 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29  and.    **   (2)
29040 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20    pTemplate has 
29050 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65  an equal or lowe
29060 72 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20  r cost than p.. 
29070 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
29080 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70  ->prereq & pTemp
29090 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70  late->prereq)==p
290a0 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
290b0 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20     /* (1)  */.  
290c0 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70     && p->rRun>=p
290d0 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20  Template->rRun  
290e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
29100 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  a) */.     && p-
29110 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65  >nOut>=pTemplate
29120 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  ->nOut          
29130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29140 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20     /* (2b) */.  
29150 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
29160 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  t( p->rSetup>=pT
29170 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
29180 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41  ); /* SETUP-INVA
29190 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20  RIANT above */. 
291a0 20 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a       break;   /*
291b0 20 43 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f   Cause p to be o
291c0 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 70 54  verwritten by pT
291d0 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d  emplate */.    }
291e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 70  .  }.  return pp
291f0 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  Prev;.}../*.** I
29200 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65  nsert or replace
29210 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74   a WhereLoop ent
29220 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d  ry using the tem
29230 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a  plate supplied..
29240 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
29250 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  g WhereLoop entr
29260 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77  y might be overw
29270 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65  ritten if the ne
29280 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73  w template.** is
29290 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20   better and has 
292a0 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
292b0 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70  es.  Or the temp
292c0 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e  late will be ign
292d0 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69  ored.** and no i
292e0 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72  nsert will occur
292f0 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
29300 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73  WhereLoop is fas
29310 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66  ter and has.** f
29320 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
29330 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c  s than the templ
29340 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ate.  Otherwise 
29350 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20  a new WhereLoop 
29360 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65  is.** added base
29370 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  d on the templat
29380 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69  e..**.** If pBui
29390 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
293a0 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65  not NULL then we
293b0 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79   care about only
293c0 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69   the.** prerequi
293d0 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61  sites and rRun a
293e0 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66  nd nOut costs of
293f0 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70   the N best loop
29400 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f  s.  That.** info
29410 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65  rmation is gathe
29420 72 65 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c  red in the pBuil
29430 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65  der->pOrSet obje
29440 63 74 2e 20 20 54 68 69 73 20 73 70 65 63 69 61  ct.  This specia
29450 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20  l.** processing 
29460 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  mode is used onl
29470 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20  y for OR clause 
29480 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
29490 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74  * When accumulat
294a0 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f  ing multiple loo
294b0 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65  ps (when pBuilde
294c0 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c  r->pOrSet is NUL
294d0 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d  L) we.** still m
294e0 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 73  ight overwrite s
294f0 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74  imilar loops wit
29500 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61  h the new templa
29510 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77  te if the.** new
29520 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74   template is bet
29530 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20  ter.  Loops may 
29540 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69  be overwritten i
29550 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
29560 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  .** conditions a
29570 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  re met:.**.**   
29580 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20   (1)  They have 
29590 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a  the same iTab..*
295a0 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68  *    (2)  They h
295b0 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f  ave the same iSo
295c0 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29  rtIdx..**    (3)
295d0 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68    The template h
295e0 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72  as same or fewer
295f0 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68   dependencies th
29600 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  an the current l
29610 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54  oop.**    (4)  T
29620 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20  he template has 
29630 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65  the same or lowe
29640 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20  r cost than the 
29650 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a  current loop.*/.
29660 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
29670 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65  LoopInsert(Where
29680 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
29690 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70  ilder, WhereLoop
296a0 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20   *pTemplate){.  
296b0 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72  WhereLoop **ppPr
296c0 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65 49  ev, *p;.  WhereI
296d0 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
296e0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
296f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
29700 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
29710 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75  db;..  /* If pBu
29720 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
29730 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f   defined, then o
29740 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f  nly keep track o
29750 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a  f the costs.  **
29760 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20   and prereqs..  
29770 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
29780 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a  r->pOrSet!=0 ){.
29790 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
297a0 4e 41 42 4c 45 44 0a 20 20 20 20 75 31 36 20 6e  NABLED.    u16 n
297b0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72   = pBuilder->pOr
297c0 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20  Set->n;.    int 
297d0 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77  x =.#endif.    w
297e0 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75  hereOrInsert(pBu
297f0 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70  ilder->pOrSet, p
29800 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
29810 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  , pTemplate->rRu
29820 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
29830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29840 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
29850 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45  ->nOut);.#if WHE
29860 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
29870 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66  /* 0x8 */.    if
29880 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
29890 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
298a0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
298b0 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25  rintf(x?"   or-%
298c0 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20  d:  ":"   or-X: 
298d0 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20 77 68   ", n);.      wh
298e0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
298f0 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72  mplate, pBuilder
29900 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65  ->pWC);.    }.#e
29910 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
29920 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
29930 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e    /* Look for an
29940 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
29950 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77  oop to replace w
29960 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  ith pTemplate.  
29970 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  */.  whereLoopAd
29980 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d  justCost(pWInfo-
29990 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
299a0 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20  te);.  ppPrev = 
299b0 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
299c0 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ser(&pWInfo->pLo
299d0 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
299e0 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d  ..  if( ppPrev==
299f0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
29a00 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
29a10 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20   a WhereLoop on 
29a20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  the list that is
29a30 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
29a40 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73  han pTemplate, s
29a50 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54  o just ignore pT
29a60 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57  emplate */.#if W
29a70 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
29a80 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
29a90 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
29aa0 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
29ab0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
29ac0 67 50 72 69 6e 74 66 28 22 20 20 20 73 6b 69 70  gPrintf("   skip
29ad0 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72  : ");.      wher
29ae0 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
29af0 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
29b00 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pWC);.    }.#end
29b10 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
29b20 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c  LITE_OK;  .  }el
29b30 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50  se{.    p = *ppP
29b40 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  rev;.  }..  /* I
29b50 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
29b60 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74  point it means t
29b70 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73  hat either p[] s
29b80 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69  hould be overwri
29b90 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70  tten.  ** with p
29ba0 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b  Template[] if p[
29bb0 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20  ] exists, or if 
29bc0 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c  p==NULL then all
29bd0 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a  ocate a new.  **
29be0 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69   WhereLoop and i
29bf0 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23  nsert it..  */.#
29c00 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
29c10 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
29c20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
29c30 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
29c40 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b  .    if( p!=0 ){
29c50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
29c60 62 75 67 50 72 69 6e 74 66 28 22 72 65 70 6c 61  bugPrintf("repla
29c70 63 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68  ce: ");.      wh
29c80 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
29c90 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
29ca0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
29cb0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
29cc0 20 20 61 64 64 3a 20 22 29 3b 0a 20 20 20 20 77    add: ");.    w
29cd0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
29ce0 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
29cf0 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e  r->pWC);.  }.#en
29d00 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  dif.  if( p==0 )
29d10 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  {.    /* Allocat
29d20 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
29d30 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  p to add to the 
29d40 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20  end of the list 
29d50 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d  */.    *ppPrev =
29d60 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
29d70 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
29d80 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a  of(WhereLoop));.
29d90 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
29da0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
29db0 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  EM;.    whereLoo
29dc0 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70 2d  pInit(p);.    p-
29dd0 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a  >pNextLoop = 0;.
29de0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
29df0 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  We will be overw
29e00 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  riting WhereLoop
29e10 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f 72   p[].  But befor
29e20 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a 20  e we do, first. 
29e30 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67 68     ** go through
29e40 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
29e50 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74 65   list and delete
29e60 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72 69   any other entri
29e70 65 73 20 62 65 73 69 64 65 73 0a 20 20 20 20 2a  es besides.    *
29e80 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20 61  * p[] that are a
29e90 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62 79  lso supplated by
29ea0 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
29eb0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
29ec0 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78 74  Tail = &p->pNext
29ed0 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65 4c  Loop;.    WhereL
29ee0 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20 20  oop *pToDel;.   
29ef0 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c 20   while( *ppTail 
29f00 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c 20  ){.      ppTail 
29f10 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  = whereLoopFindL
29f20 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70 54  esser(ppTail, pT
29f30 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20 20  emplate);.      
29f40 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20 29 20  if( ppTail==0 ) 
29f50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f  break;.      pTo
29f60 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b 0a 20  Del = *ppTail;. 
29f70 20 20 20 20 20 69 66 28 20 70 54 6f 44 65 6c 3d       if( pToDel=
29f80 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
29f90 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54 6f 44    *ppTail = pToD
29fa0 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23  el->pNextLoop;.#
29fb0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
29fc0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
29fd0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
29fe0 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
29ff0 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
2a000 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2a010 22 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a 20 20  " delete: ");.  
2a020 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
2a030 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70 42 75  rint(pToDel, pBu
2a040 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
2a050 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2a060 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74    whereLoopDelet
2a070 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20  e(db, pToDel);. 
2a080 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 65 72 65     }.  }.  where
2a090 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20  LoopXfer(db, p, 
2a0a0 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66  pTemplate);.  if
2a0b0 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
2a0c0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
2a0d0 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e  LE)==0 ){.    In
2a0e0 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d  dex *pIndex = p-
2a0f0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
2a100 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20  .    if( pIndex 
2a110 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d  && pIndex->tnum=
2a120 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75  =0 ){.      p->u
2a130 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
2a140 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
2a150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
2a170 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e   the WhereLoop.n
2a180 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77 61  Out value downwa
2a190 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  rd to account fo
2a1a0 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  r terms of the.*
2a1b0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
2a1c0 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
2a1d0 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63 68  e loop but which
2a1e0 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79   are not used by
2a1f0 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 0a   an.** index..*.
2a200 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 57 48 45  ** For every WHE
2a210 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
2a220 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20  hat is not used 
2a230 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  by the index.** 
2a240 61 6e 64 20 77 68 69 63 68 20 68 61 73 20 61 20  and which has a 
2a250 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
2a260 79 20 61 73 73 69 67 6e 65 64 20 62 79 20 6f 6e  y assigned by on
2a270 65 20 6f 66 20 74 68 65 20 6c 69 6b 65 6c 69 68  e of the likelih
2a280 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65 6c 79  ood(),.** likely
2a290 28 29 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c 79 28  (), or unlikely(
2a2a0 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2c  ) SQL functions,
2a2b0 20 72 65 64 75 63 65 20 74 68 65 20 65 73 74 69   reduce the esti
2a2c0 6d 61 74 65 64 20 6e 75 6d 62 65 72 0a 2a 2a 20  mated number.** 
2a2d0 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 62  of output rows b
2a2e0 79 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  y the probabilit
2a2f0 79 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  y specified..**.
2a300 2a 2a 20 54 55 4e 49 4e 47 3a 20 20 46 6f 72 20  ** TUNING:  For 
2a310 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75  every WHERE clau
2a320 73 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  se term that is 
2a330 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20  not used by the 
2a340 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69  index.** and whi
2a350 63 68 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ch does not have
2a360 20 61 6e 20 61 73 73 69 67 6e 65 64 20 74 72 75   an assigned tru
2a370 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2c 20  th probability, 
2a380 68 65 75 72 69 73 74 69 63 73 0a 2a 2a 20 64 65  heuristics.** de
2a390 73 63 72 69 62 65 64 20 62 65 6c 6f 77 20 61 72  scribed below ar
2a3a0 65 20 75 73 65 64 20 74 6f 20 74 72 79 20 74 6f  e used to try to
2a3b0 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 74 72   estimate the tr
2a3c0 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e  uth probability.
2a3d0 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50 65 72  .** TODO --> Per
2a3e0 68 61 70 73 20 74 68 69 73 20 69 73 20 73 6f 6d  haps this is som
2a3f0 65 74 68 69 6e 67 20 74 68 61 74 20 63 6f 75 6c  ething that coul
2a400 64 20 62 65 20 69 6d 70 72 6f 76 65 64 20 62 79  d be improved by
2a410 20 62 65 74 74 65 72 0a 2a 2a 20 74 61 62 6c 65   better.** table
2a420 20 73 74 61 74 69 73 74 69 63 73 2e 0a 2a 2a 0a   statistics..**.
2a430 2a 2a 20 48 65 75 72 69 73 74 69 63 20 31 3a 20  ** Heuristic 1: 
2a440 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 72   Estimate the tr
2a450 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  uth probability 
2a460 61 73 20 39 33 2e 37 35 25 2e 20 20 54 68 65 20  as 93.75%.  The 
2a470 39 33 2e 37 35 25 0a 2a 2a 20 76 61 6c 75 65 20  93.75%.** value 
2a480 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 2d  corresponds to -
2a490 31 20 69 6e 20 4c 6f 67 45 73 74 20 6e 6f 74 61  1 in LogEst nota
2a4a0 74 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20 6d 65  tion, so this me
2a4b0 61 6e 73 20 64 65 63 72 65 6d 65 6e 74 0a 2a 2a  ans decrement.**
2a4c0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e   the WhereLoop.n
2a4d0 4f 75 74 20 66 69 65 6c 64 20 66 6f 72 20 65 76  Out field for ev
2a4e0 65 72 79 20 73 75 63 68 20 57 48 45 52 45 20 63  ery such WHERE c
2a4f0 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 0a 2a  lause term..**.*
2a500 2a 20 48 65 75 72 69 73 74 69 63 20 32 3a 20 20  * Heuristic 2:  
2a510 49 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  If there exists 
2a520 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52  one or more WHER
2a530 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  E clause terms o
2a540 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 22 78  f the.** form "x
2a550 3d 3d 45 58 50 52 22 20 61 6e 64 20 45 58 50 52  ==EXPR" and EXPR
2a560 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61   is not a consta
2a570 6e 74 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20  nt 0 or 1, then 
2a580 6d 61 6b 65 20 73 75 72 65 20 74 68 65 0a 2a 2a  make sure the.**
2a590 20 66 69 6e 61 6c 20 6f 75 74 70 75 74 20 72 6f   final output ro
2a5a0 77 20 65 73 74 69 6d 61 74 65 20 69 73 20 6e 6f  w estimate is no
2a5b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 2f   greater than 1/
2a5c0 34 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 6e  4 of the total n
2a5d0 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73  umber.** of rows
2a5e0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
2a5f0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
2a600 61 73 73 75 6d 65 20 74 68 61 74 20 78 3d 3d 45  assume that x==E
2a610 58 50 52 20 77 69 6c 6c 20 66 69 6c 74 65 72 0a  XPR will filter.
2a620 2a 2a 20 6f 75 74 20 61 74 20 6c 65 61 73 74 20  ** out at least 
2a630 33 20 6f 75 74 20 6f 66 20 34 20 72 6f 77 73 2e  3 out of 4 rows.
2a640 20 20 49 66 20 45 58 50 52 20 69 73 20 2d 31 20    If EXPR is -1 
2a650 6f 72 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20  or 0 or 1, then 
2a660 6d 61 79 62 65 20 74 68 65 0a 2a 2a 20 22 78 22  maybe the.** "x"
2a670 20 63 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f 6c 65   column is boole
2a680 61 6e 20 6f 72 20 65 6c 73 65 20 2d 31 20 6f 72  an or else -1 or
2a690 20 30 20 6f 72 20 31 20 69 73 20 61 20 63 6f 6d   0 or 1 is a com
2a6a0 6d 6f 6e 20 64 65 66 61 75 6c 74 20 76 61 6c 75  mon default valu
2a6b0 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 22 78 22 20  e.** on the "x" 
2a6c0 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f 20 69 6e  column and so in
2a6d0 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20   that case only 
2a6e0 63 61 70 20 74 68 65 20 6f 75 74 70 75 74 20 72  cap the output r
2a6f0 6f 77 20 65 73 74 69 6d 61 74 65 0a 2a 2a 20 61  ow estimate.** a
2a700 74 20 31 2f 32 20 69 6e 73 74 65 61 64 20 6f 66  t 1/2 instead of
2a710 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   1/4..*/.static 
2a720 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75  void whereLoopOu
2a730 74 70 75 74 41 64 6a 75 73 74 28 0a 20 20 57 68  tputAdjust(.  Wh
2a740 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
2a750 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
2a760 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
2a770 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20  ereLoop *pLoop, 
2a780 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70       /* The loop
2a790 20 74 6f 20 61 64 6a 75 73 74 20 64 6f 77 6e 77   to adjust downw
2a7a0 61 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ard */.  LogEst 
2a7b0 6e 52 6f 77 20 20 20 20 20 20 20 20 20 20 20 20  nRow            
2a7c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* Number of row
2a7d0 73 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20  s in the entire 
2a7e0 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68  table */.){.  Wh
2a7f0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
2a800 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e  *pX;.  Bitmask n
2a810 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c  otAllowed = ~(pL
2a820 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f  oop->prereq|pLoo
2a830 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20  p->maskSelf);.  
2a840 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 4c  int i, j, k;.  L
2a850 6f 67 45 73 74 20 69 52 65 64 75 63 65 20 3d 20  ogEst iReduce = 
2a860 30 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f 70 2d 3e  0;    /* pLoop->
2a870 6e 4f 75 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  nOut should not 
2a880 65 78 63 65 65 64 20 6e 52 6f 77 2d 69 52 65 64  exceed nRow-iRed
2a890 75 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  uce */..  assert
2a8a0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
2a8b0 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
2a8c0 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 66 6f  NDEX)==0 );.  fo
2a8d0 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20  r(i=pWC->nTerm, 
2a8e0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e  pTerm=pWC->a; i>
2a8f0 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; i--, pTerm++)
2a900 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
2a910 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
2a920 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62  _VIRTUAL)!=0 ) b
2a930 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70  reak;.    if( (p
2a940 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
2a950 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
2a960 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  f)==0 ) continue
2a970 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
2a980 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
2a990 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63  tAllowed)!=0 ) c
2a9a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
2a9b0 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d  (j=pLoop->nLTerm
2a9c0 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
2a9d0 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70        pX = pLoop
2a9e0 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
2a9f0 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63     if( pX==0 ) c
2aa00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
2aa10 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62  f( pX==pTerm ) b
2aa20 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
2aa30 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26  pX->iParent>=0 &
2aa40 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69  & (&pWC->a[pX->i
2aa50 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20  Parent])==pTerm 
2aa60 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
2aa70 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20     if( j<0 ){.  
2aa80 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
2aa90 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20  ruthProb<=0 ){. 
2aaa0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 74         /* If a t
2aab0 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
2aac0 20 69 73 20 73 70 65 63 69 66 69 65 64 20 75 73   is specified us
2aad0 69 6e 67 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f  ing the likeliho
2aae0 6f 64 28 29 20 68 69 6e 74 73 2c 0a 20 20 20 20  od() hints,.    
2aaf0 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20      ** then use 
2ab00 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
2ab10 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20  provided by the 
2ab20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 2a 2f 0a  application. */.
2ab30 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e          pLoop->n
2ab40 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72  Out += pTerm->tr
2ab50 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 7d  uthProb;.      }
2ab60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2ab70 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20   In the absence 
2ab80 6f 66 20 65 78 70 6c 69 63 69 74 20 74 72 75 74  of explicit trut
2ab90 68 20 70 72 6f 62 61 62 69 6c 69 74 69 65 73 2c  h probabilities,
2aba0 20 75 73 65 20 68 65 75 72 69 73 74 69 63 73 20   use heuristics 
2abb0 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75  to.        ** gu
2abc0 65 73 73 20 61 20 72 65 61 73 6f 6e 61 62 6c 65  ess a reasonable
2abd0 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
2abe0 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ty. */.        p
2abf0 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20  Loop->nOut--;.  
2ac00 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
2ac10 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51  >eOperator&WO_EQ
2ac20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
2ac30 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
2ac40 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
2ac50 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  t;.          if(
2ac60 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
2ac70 74 65 67 65 72 28 70 52 69 67 68 74 2c 20 26 6b  teger(pRight, &k
2ac80 29 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20  ) && k>=(-1) && 
2ac90 6b 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  k<=1 ){.        
2aca0 20 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20      k = 10;.    
2acb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2acc0 20 20 20 20 20 20 20 20 20 6b 20 3d 20 32 30 3b           k = 20;
2acd0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ace0 20 20 20 20 20 20 20 69 66 28 20 69 52 65 64 75         if( iRedu
2acf0 63 65 3c 6b 20 29 20 69 52 65 64 75 63 65 20 3d  ce<k ) iReduce =
2ad00 20 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   k;.        }.  
2ad10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2ad20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75    if( pLoop->nOu
2ad30 74 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75 63 65  t > nRow-iReduce
2ad40 20 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20   )  pLoop->nOut 
2ad50 3d 20 6e 52 6f 77 20 2d 20 69 52 65 64 75 63 65  = nRow - iReduce
2ad60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
2ad70 74 20 74 68 65 20 63 6f 73 74 20 43 20 62 79 20  t the cost C by 
2ad80 74 68 65 20 63 6f 73 74 4d 75 6c 74 20 66 61 63  the costMult fac
2ad90 74 65 72 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c  ter T.  This onl
2ada0 79 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20 63  y occurs if.** c
2adb0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53  ompiled with -DS
2adc0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53  QLITE_ENABLE_COS
2add0 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20  TMULT.*/.#ifdef 
2ade0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
2adf0 53 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65 20  STMULT.# define 
2ae00 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
2ae10 69 65 72 28 43 2c 54 29 20 20 43 20 2b 3d 20 54  ier(C,T)  C += T
2ae20 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
2ae30 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
2ae40 69 65 72 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a  ier(C,T).#endif.
2ae50 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73  ./*.** We have s
2ae60 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42  o far matched pB
2ae70 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
2ae80 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20  btree.nEq terms 
2ae90 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78  of the .** index
2aea0 20 70 49 6e 64 65 78 2e 20 54 72 79 20 74 6f 20   pIndex. Try to 
2aeb0 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a  match one more..
2aec0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
2aed0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2aee0 65 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  ed, pBuilder->pN
2aef0 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e  ew->nOut contain
2af00 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72  s the .** number
2af10 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74 65   of rows expecte
2af20 64 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20  d to be visited 
2af30 62 79 20 66 69 6c 74 65 72 69 6e 67 20 75 73 69  by filtering usi
2af40 6e 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74  ng the nEq .** t
2af50 65 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74  erms only. If it
2af60 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 74 68   is modified, th
2af70 69 73 20 76 61 6c 75 65 20 69 73 20 72 65 73 74  is value is rest
2af80 6f 72 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  ored before this
2af90 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65   .** function re
2afa0 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  turns..**.** If 
2afb0 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c  pProbe->tnum==0,
2afc0 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64   that means pInd
2afd0 65 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64  ex is a fake ind
2afe0 65 78 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a  ex used for the.
2aff0 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
2b000 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69  RY KEY..*/.stati
2b010 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
2b020 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20  ddBtreeIndex(.  
2b030 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
2b040 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20   *pBuilder,     
2b050 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70  /* The WhereLoop
2b060 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74   factory */.  st
2b070 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2b080 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a  m *pSrc,      /*
2b090 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
2b0a0 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  m being analyzed
2b0b0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
2b0c0 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  obe,            
2b0d0 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
2b0e0 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c  x on pSrc */.  L
2b0f0 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20  ogEst nInMul    
2b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b110 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20  * log(Number of 
2b120 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74  iterations due t
2b130 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68  o IN) */.){.  Wh
2b140 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
2b150 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
2b160 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e  fo;  /* WHERE an
2b170 61 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  alyse context */
2b180 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2b190 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
2b1a0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e;        /* Par
2b1b0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
2b1c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2b1d0 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
2b1e0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
2b1f0 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20  nnection malloc 
2b200 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
2b210 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20  reLoop *pNew;   
2b220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b230 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f  Template WhereLo
2b240 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  op under constru
2b250 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ction */.  Where
2b260 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
2b270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
2b280 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20  WhereTerm under 
2b290 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f  consideration */
2b2a0 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20  .  int opMask;  
2b2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2c0 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72     /* Valid oper
2b2d0 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72  ators for constr
2b2e0 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65  aints */.  Where
2b2f0 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20  Scan scan;      
2b300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
2b310 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45  erator for WHERE
2b320 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d   terms */.  Bitm
2b330 61 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71  ask saved_prereq
2b340 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;           /* O
2b350 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
2b360 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f   pNew->prereq */
2b370 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54  .  u16 saved_nLT
2b380 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
2b390 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
2b3a0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c  alue of pNew->nL
2b3b0 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61  Term */.  u16 sa
2b3c0 76 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20  ved_nEq;        
2b3d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
2b3e0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
2b3f0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
2b400 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
2b410 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20  nSkip;          
2b420 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
2b430 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
2b440 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20  >nSkip */.  u32 
2b450 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20  saved_wsFlags;  
2b460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2b470 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
2b480 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a   pNew->wsFlags *
2b490 2f 0a 20 20 4c 6f 67 45 73 74 20 73 61 76 65 64  /.  LogEst saved
2b4a0 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20  _nOut;          
2b4b0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
2b4c0 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e  value of pNew->n
2b4d0 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  Out */.  int iCo
2b4e0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2b4f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2b500 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  x of the column 
2b510 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
2b520 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2b530 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2b540 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2b550 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69   */.  LogEst rSi
2b560 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
2b570 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2b580 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
2b590 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  able */.  LogEst
2b5a0 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20   rLogSize;      
2b5b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
2b5c0 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20  arithm of table 
2b5d0 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  size */.  WhereT
2b5e0 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a  erm *pTop = 0, *
2b5f0 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70  pBtm = 0; /* Top
2b600 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67   and bottom rang
2b610 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
2b620 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ..  pNew = pBuil
2b630 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28  der->pNew;.  if(
2b640 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2b650 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
2b660 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65  E_NOMEM;..  asse
2b670 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
2b680 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
2b690 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20  ALTABLE)==0 );. 
2b6a0 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
2b6b0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2b6c0 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b  TOP_LIMIT)==0 );
2b6d0 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46  .  if( pNew->wsF
2b6e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
2b6f0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70  _LIMIT ){.    op
2b700 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f  Mask = WO_LT|WO_
2b710 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
2b720 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
2b730 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79  || (pSrc->jointy
2b740 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
2b750 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d   ){.    opMask =
2b760 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
2b770 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
2b780 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  O_LE;.  }else{. 
2b790 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
2b7a0 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c  Q|WO_IN|WO_ISNUL
2b7b0 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  L|WO_GT|WO_GE|WO
2b7c0 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a 20  _LT|WO_LE;.  }. 
2b7d0 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e   if( pProbe->bUn
2b7e0 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b  ordered ) opMask
2b7f0 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47   &= ~(WO_GT|WO_G
2b800 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a  E|WO_LT|WO_LE);.
2b810 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
2b820 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72  >u.btree.nEq<pPr
2b830 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  obe->nColumn );.
2b840 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d    iCol = pProbe-
2b850 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d 3e  >aiColumn[pNew->
2b860 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 0a 20  u.btree.nEq];.. 
2b870 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63   pTerm = whereSc
2b880 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42  anInit(&scan, pB
2b890 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72  uilder->pWC, pSr
2b8a0 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c  c->iCursor, iCol
2b8b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b8c0 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b            opMask
2b8d0 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 73 61 76  , pProbe);.  sav
2b8e0 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75  ed_nEq = pNew->u
2b8f0 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61  .btree.nEq;.  sa
2b900 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e 65 77  ved_nSkip = pNew
2b910 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65 64  ->nSkip;.  saved
2b920 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e  _nLTerm = pNew->
2b930 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f  nLTerm;.  saved_
2b940 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e  wsFlags = pNew->
2b950 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64  wsFlags;.  saved
2b960 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e  _prereq = pNew->
2b970 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f  prereq;.  saved_
2b980 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  nOut = pNew->nOu
2b990 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  t;.  pNew->rSetu
2b9a0 70 20 3d 20 30 3b 0a 20 20 72 53 69 7a 65 20 3d  p = 0;.  rSize =
2b9b0 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
2b9c0 67 45 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f 67 53  gEst[0];.  rLogS
2b9d0 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69  ize = estLog(rSi
2b9e0 7a 65 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63 3d  ze);.  for(; rc=
2b9f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54  =SQLITE_OK && pT
2ba00 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20  erm!=0; pTerm = 
2ba10 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73  whereScanNext(&s
2ba20 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36 20 65  can)){.    u16 e
2ba30 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65  Op = pTerm->eOpe
2ba40 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f 72  rator;   /* Shor
2ba50 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72 6d 2d  thand for pTerm-
2ba60 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  >eOperator */.  
2ba70 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 49 64    LogEst rCostId
2ba80 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f  x;.    LogEst nO
2ba90 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20 20 20  utUnadjusted;   
2baa0 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65 66       /* nOut bef
2bab0 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57 48 45  ore IN() and WHE
2bac0 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 2a  RE adjustments *
2bad0 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20  /.    int nIn = 
2bae0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
2baf0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
2bb00 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74 20 6e  _STAT4.    int n
2bb10 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c  RecValid = pBuil
2bb20 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a  der->nRecValid;.
2bb30 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
2bb40 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c  eOp==WO_ISNULL |
2bb50 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  | (pTerm->wtFlag
2bb60 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30  s&TERM_VNULL)!=0
2bb70 29 0a 20 20 20 20 20 26 26 20 28 69 43 6f 6c 3c  ).     && (iCol<
2bb80 30 20 7c 7c 20 70 53 72 63 2d 3e 70 54 61 62 2d  0 || pSrc->pTab-
2bb90 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e  >aCol[iCol].notN
2bba0 75 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ull).    ){.    
2bbb0 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69    continue; /* i
2bbc0 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e  gnore IS [NOT] N
2bbd0 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ULL constraints 
2bbe0 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75  on NOT NULL colu
2bbf0 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  mns */.    }.   
2bc00 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
2bc10 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e  eqRight & pNew->
2bc20 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69  maskSelf ) conti
2bc30 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  nue;..    /* Do 
2bc40 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75 70  not allow the up
2bc50 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20 4c  per bound of a L
2bc60 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
2bc70 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
2bc80 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78 20  t.    ** to mix 
2bc90 77 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61 6e  with a lower ran
2bca0 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73 6f  ge bound from so
2bcb0 6d 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65 20  me other source 
2bcc0 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  */.    if( pTerm
2bcd0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
2bce0 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65 72  _LIKEOPT && pTer
2bcf0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
2bd00 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  _LT ) continue;.
2bd10 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
2bd20 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61  gs = saved_wsFla
2bd30 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  gs;.    pNew->u.
2bd40 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65  btree.nEq = save
2bd50 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d  d_nEq;.    pNew-
2bd60 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f  >nLTerm = saved_
2bd70 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20  nLTerm;.    if( 
2bd80 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
2bd90 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e  db, pNew, pNew->
2bda0 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61  nLTerm+1) ) brea
2bdb0 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20  k; /* OOM */.   
2bdc0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
2bdd0 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20  ew->nLTerm++] = 
2bde0 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d  pTerm;.    pNew-
2bdf0 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76 65 64  >prereq = (saved
2be00 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d  _prereq | pTerm-
2be10 3e 70 72 65 72 65 71 52 69 67 68 74 29 20 26 20  >prereqRight) & 
2be20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b  ~pNew->maskSelf;
2be30 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 49  ..    assert( nI
2be40 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20  nMul==0.        
2be50 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  || (pNew->wsFlag
2be60 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
2be70 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20  _NULL)!=0 .     
2be80 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46     || (pNew->wsF
2be90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
2bea0 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20  UMN_IN)!=0 .    
2beb0 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73      || (pNew->ws
2bec0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b  Flags & WHERE_SK
2bed0 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20 20 20  IPSCAN)!=0 .    
2bee0 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f 70 20  );..    if( eOp 
2bef0 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
2bf00 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
2bf10 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
2bf20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2bf30 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
2bf40 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 45  _IN;.      if( E
2bf50 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2bf60 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
2bf70 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ct) ){.        /
2bf80 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  * "x IN (SELECT 
2bf90 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20  ...)":  TUNING: 
2bfa0 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72  the SELECT retur
2bfb0 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20  ns 25 rows */.  
2bfc0 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20        nIn = 46; 
2bfd0 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71 6c   assert( 46==sql
2bfe0 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20 29  ite3LogEst(25) )
2bff0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2c000 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
2c010 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70 72  x.pList && pExpr
2c020 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
2c030 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
2c040 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61  "x IN (value, va
2c050 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20  lue, ...)" */.  
2c060 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69        nIn = sqli
2c070 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72 2d  te3LogEst(pExpr-
2c080 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
2c090 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c0a0 61 73 73 65 72 74 28 20 6e 49 6e 3e 30 20 29 3b  assert( nIn>0 );
2c0b0 20 20 2f 2a 20 52 48 53 20 61 6c 77 61 79 73 20    /* RHS always 
2c0c0 68 61 73 20 32 20 6f 72 20 6d 6f 72 65 20 74 65  has 2 or more te
2c0d0 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61 72 73  rms...  The pars
2c0e0 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  er.             
2c0f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68             ** ch
2c100 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f 29 22  anges "x IN (?)"
2c110 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a   into "x=?". */.
2c120 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
2c130 4f 70 20 26 20 28 57 4f 5f 45 51 29 20 29 7b 0a  Op & (WO_EQ) ){.
2c140 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
2c150 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
2c160 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69 66  UMN_EQ;.      if
2c170 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 28 6e 49 6e  ( iCol<0 || (nIn
2c180 4d 75 6c 3d 3d 30 20 26 26 20 70 4e 65 77 2d 3e  Mul==0 && pNew->
2c190 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 70 50 72  u.btree.nEq==pPr
2c1a0 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 20  obe->nKeyCol-1) 
2c1b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
2c1c0 43 6f 6c 3e 3d 30 20 26 26 20 70 50 72 6f 62 65  Col>=0 && pProbe
2c1d0 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 3d 3d 30  ->uniqNotNull==0
2c1e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
2c1f0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
2c200 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 3b  HERE_UNQ_WANTED;
2c210 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2c220 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2c230 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
2c240 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 20  _ONEROW;.       
2c250 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2c260 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 57  else if( eOp & W
2c270 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
2c280 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2c290 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
2c2a0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  NULL;.    }else 
2c2b0 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 47 54  if( eOp & (WO_GT
2c2c0 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20  |WO_GE) ){.     
2c2d0 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
2c2e0 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20 20   WO_GT );.      
2c2f0 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
2c300 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 70  WO_GE );.      p
2c310 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
2c320 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
2c330 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  GE|WHERE_BTM_LIM
2c340 49 54 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d  IT;.      pBtm =
2c350 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54   pTerm;.      pT
2c360 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  op = 0;.      if
2c370 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
2c380 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20   & TERM_LIKEOPT 
2c390 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 61  ){.        /* Ra
2c3a0 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74 73 20 74  nge contraints t
2c3b0 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68  hat come from th
2c3c0 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74  e LIKE optimizat
2c3d0 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 20 20  ion are.        
2c3e0 2a 2a 20 61 6c 77 61 79 73 20 75 73 65 64 20 69  ** always used i
2c3f0 6e 20 70 61 69 72 73 2e 20 2a 2f 0a 20 20 20 20  n pairs. */.    
2c400 20 20 20 20 70 54 6f 70 20 3d 20 26 70 54 65 72      pTop = &pTer
2c410 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  m[1];.        as
2c420 73 65 72 74 28 20 28 70 54 6f 70 2d 28 70 54 65  sert( (pTop-(pTe
2c430 72 6d 2d 3e 70 57 43 2d 3e 61 29 29 3c 70 54 65  rm->pWC->a))<pTe
2c440 72 6d 2d 3e 70 57 43 2d 3e 6e 54 65 72 6d 20 29  rm->pWC->nTerm )
2c450 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2c460 28 20 70 54 6f 70 2d 3e 77 74 46 6c 61 67 73 20  ( pTop->wtFlags 
2c470 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29  & TERM_LIKEOPT )
2c480 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2c490 28 20 70 54 6f 70 2d 3e 65 4f 70 65 72 61 74 6f  ( pTop->eOperato
2c4a0 72 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20  r==WO_LT );.    
2c4b0 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
2c4c0 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77  pResize(db, pNew
2c4d0 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31  , pNew->nLTerm+1
2c4e0 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f  ) ) break; /* OO
2c4f0 4d 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  M */.        pNe
2c500 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
2c510 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70  nLTerm++] = pTop
2c520 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2c530 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
2c540 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _TOP_LIMIT;.    
2c550 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2c560 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70       assert( eOp
2c570 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
2c580 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2c590 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20  se( eOp & WO_LT 
2c5a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2c5b0 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29  e( eOp & WO_LE )
2c5c0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
2c5d0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
2c5e0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
2c5f0 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
2c600 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b     pTop = pTerm;
2c610 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70  .      pBtm = (p
2c620 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
2c630 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21  HERE_BTM_LIMIT)!
2c640 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  =0 ?.           
2c650 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2c660 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
2c670 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20  erm-2] : 0;.    
2c680 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
2c690 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f  s point pNew->nO
2c6a0 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ut is set to the
2c6b0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
2c6c0 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20 20 20  expected to.    
2c6d0 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20 62 79  ** be visited by
2c6e0 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20   the index scan 
2c6f0 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65 72 69  before consideri
2c700 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f  ng term pTerm, o
2c710 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c  r the.    ** val
2c720 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e  ues of nIn and n
2c730 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20  InMul. In other 
2c740 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e 67 20  words, assuming 
2c750 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a  that all .    **
2c760 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72   "x IN(...)" ter
2c770 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65 64 20  ms are replaced 
2c780 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20 54 68  with "x = ?". Th
2c790 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  is block updates
2c7a0 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
2c7b0 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
2c7c0 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 70  to account for p
2c7d0 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49  Term (but not nI
2c7e0 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20  n/nInMul).  */. 
2c7f0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
2c800 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
2c810 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  t );.    if( pNe
2c820 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
2c830 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
2c840 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
2c850 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20 73 74  st nOut using st
2c860 61 74 33 2f 73 74 61 74 34 20 64 61 74 61 2e 20  at3/stat4 data. 
2c870 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  Or, if there is 
2c880 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34 0a 20  no stat3/stat4. 
2c890 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20 75 73       ** data, us
2c8a0 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  ing some other e
2c8b0 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20  stimate.  */.   
2c8c0 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61     whereRangeSca
2c8d0 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
2c8e0 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f  ilder, pBtm, pTo
2c8f0 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65  p, pNew);.    }e
2c900 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
2c910 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62  Eq = ++pNew->u.b
2c920 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20  tree.nEq;.      
2c930 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57  assert( eOp & (W
2c940 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57  O_ISNULL|WO_EQ|W
2c950 4f 5f 49 4e 29 20 29 3b 0a 0a 20 20 20 20 20 20  O_IN) );..      
2c960 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
2c970 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
2c980 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
2c990 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20  m->truthProb<=0 
2c9a0 26 26 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  && iCol>=0 ){.  
2c9b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 65        assert( (e
2c9c0 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e  Op & WO_IN) || n
2c9d0 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  In==0 );.       
2c9e0 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
2c9f0 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20   WO_IN );.      
2ca00 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
2ca10 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
2ca20 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2ca30 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20  nOut -= nIn;.   
2ca40 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66     }else{.#ifdef
2ca50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
2ca60 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
2ca70 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f        tRowcnt nO
2ca80 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
2ca90 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20  if( nInMul==0 . 
2caa0 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62          && pProb
2cab0 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20  e->nSample .    
2cac0 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e       && pNew->u.
2cad0 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62  btree.nEq<=pProb
2cae0 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20  e->nSampleCol.  
2caf0 20 20 20 20 20 20 20 26 26 20 28 28 65 4f 70 20         && ((eOp 
2cb00 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21  & WO_IN)==0 || !
2cb10 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2cb20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
2cb30 5f 78 49 73 53 65 6c 65 63 74 29 29 0a 20 20 20  _xIsSelect)).   
2cb40 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2cb50 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
2cb60 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
2cb70 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70          if( (eOp
2cb80 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e   & (WO_EQ|WO_ISN
2cb90 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ULL))!=0 ){.    
2cba0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2cbb0 28 20 65 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b  ( eOp & WO_EQ );
2cbc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
2cbd0 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
2cbe0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
2cbf0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2cc00 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61  EqualScanEst(pPa
2cc10 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
2cc20 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e  Expr->pRight, &n
2cc30 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Out);.          
2cc40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2cc50 20 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53     rc = whereInS
2cc60 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
2cc70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e  Builder, pExpr->
2cc80 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b  x.pList, &nOut);
2cc90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2cca0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2ccb0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
2ccc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ccd0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2cce0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
2ccf0 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  reak;          /
2cd00 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  * Jump out of th
2cd10 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a  e pTerm loop */.
2cd20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f            if( nO
2cd30 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ut ){.          
2cd40 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
2cd50 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75  qlite3LogEst(nOu
2cd60 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
2cd70 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73  if( pNew->nOut>s
2cd80 61 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77  aved_nOut ) pNew
2cd90 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
2cda0 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Out;.           
2cdb0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e   pNew->nOut -= n
2cdc0 49 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  In;.          }.
2cdd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cde0 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a    if( nOut==0 ).
2cdf0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
2ce00 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
2ce10 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65  >nOut += (pProbe
2ce20 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45  ->aiRowLogEst[nE
2ce30 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52  q] - pProbe->aiR
2ce40 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29  owLogEst[nEq-1])
2ce50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ce60 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
2ce70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
2ce80 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65  * TUNING: If the
2ce90 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68  re is no likelih
2cea0 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73  ood() value, ass
2ceb0 75 6d 65 20 74 68 61 74 20 61 20 0a 20 20 20 20  ume that a .    
2cec0 20 20 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20          ** "col 
2ced0 49 53 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73  IS NULL" express
2cee0 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63  ion matches twic
2cef0 65 20 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a  e as many rows .
2cf00 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
2cf10 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20  s (col=?). */.  
2cf20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2cf30 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20  nOut += 10;.    
2cf40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cf50 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2cf60 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73  .    /* Set rCos
2cf70 74 49 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74  tIdx to the cost
2cf80 20 6f 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c   of visiting sel
2cf90 65 63 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e  ected rows in in
2cfa0 64 65 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20  dex. Add.    ** 
2cfb0 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e  it to pNew->rRun
2cfc0 2c 20 77 68 69 63 68 20 69 73 20 63 75 72 72 65  , which is curre
2cfd0 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20  ntly set to the 
2cfe0 63 6f 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65  cost of the inde
2cff0 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e  x.    ** seek on
2d000 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69  ly. Then, if thi
2d010 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  s is a non-cover
2d020 69 6e 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74  ing index, add t
2d030 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a  he cost of.    *
2d040 2a 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 72  * visiting the r
2d050 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ows in the main 
2d060 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72  table.  */.    r
2d070 43 6f 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e  CostIdx = pNew->
2d080 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70  nOut + 1 + (15*p
2d090 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29  Probe->szIdxRow)
2d0a0 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54  /pSrc->pTab->szT
2d0b0 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d  abRow;.    pNew-
2d0c0 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
2d0d0 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a  ogEstAdd(rLogSiz
2d0e0 65 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20  e, rCostIdx);.  
2d0f0 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
2d100 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 44  lags & (WHERE_ID
2d110 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b  X_ONLY|WHERE_IPK
2d120 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ))==0 ){.      p
2d130 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
2d140 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65  te3LogEstAdd(pNe
2d150 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e  w->rRun, pNew->n
2d160 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d  Out + 16);.    }
2d170 0a 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75  .    ApplyCostMu
2d180 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72  ltiplier(pNew->r
2d190 52 75 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54 61  Run, pProbe->pTa
2d1a0 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  ble->costMult);.
2d1b0 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73  .    nOutUnadjus
2d1c0 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  ted = pNew->nOut
2d1d0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e  ;.    pNew->rRun
2d1e0 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e   += nInMul + nIn
2d1f0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
2d200 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e   += nInMul + nIn
2d210 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f  ;.    whereLoopO
2d220 75 74 70 75 74 41 64 6a 75 73 74 28 70 42 75 69  utputAdjust(pBui
2d230 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 2c  lder->pWC, pNew,
2d240 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20   rSize);.    rc 
2d250 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
2d260 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
2d270 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77  );..    if( pNew
2d280 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2d290 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29  E_COLUMN_RANGE )
2d2a0 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  {.      pNew->nO
2d2b0 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
2d2c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2d2d0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
2d2e0 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20  OutUnadjusted;. 
2d2f0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
2d300 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
2d310 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d  HERE_TOP_LIMIT)=
2d320 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d  =0.     && pNew-
2d330 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72  >u.btree.nEq<pPr
2d340 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20  obe->nColumn.   
2d350 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c   ){.      whereL
2d360 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
2d370 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c  (pBuilder, pSrc,
2d380 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b   pProbe, nInMul+
2d390 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nIn);.    }.    
2d3a0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
2d3b0 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20  ed_nOut;.#ifdef 
2d3c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
2d3d0 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
2d3e0 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
2d3f0 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64  alid = nRecValid
2d400 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70  ;.#endif.  }.  p
2d410 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61  New->prereq = sa
2d420 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e  ved_prereq;.  pN
2d430 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
2d440 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70  = saved_nEq;.  p
2d450 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76  New->nSkip = sav
2d460 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77  ed_nSkip;.  pNew
2d470 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
2d480 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65  d_wsFlags;.  pNe
2d490 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
2d4a0 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  nOut;.  pNew->nL
2d4b0 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
2d4c0 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69  erm;..  /* Consi
2d4d0 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70  der using a skip
2d4e0 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65 20 61  -scan if there a
2d4f0 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  re no WHERE clau
2d500 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  se constraints. 
2d510 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f   ** available fo
2d520 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  r the left-most 
2d530 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64  terms of the ind
2d540 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61  ex, and if the a
2d550 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62  verage.  ** numb
2d560 65 72 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e  er of repeats in
2d570 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74   the left-most t
2d580 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74  erms is at least
2d590 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20   18. .  **.  ** 
2d5a0 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72  The magic number
2d5b0 20 31 38 20 69 73 20 73 65 6c 65 63 74 65 64 20   18 is selected 
2d5c0 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74 68 61  on the basis tha
2d5d0 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f  t scanning 17 ro
2d5e0 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73  ws.  ** is almos
2d5f0 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72  t always quicker
2d600 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73   than an index s
2d610 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68  eek (even though
2d620 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20   if the index.  
2d630 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65  ** contains fewe
2d640 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73  r than 2^17 rows
2d650 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72   we assume other
2d660 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61  wise in other pa
2d670 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  rts of.  ** the 
2d680 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e  code). And, even
2d690 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69   if it is not, i
2d6a0 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
2d6b0 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e  too much slower.
2d6c0 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74   .  ** On the ot
2d6d0 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78  her hand, the ex
2d6e0 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20  tra seeks could 
2d6f0 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73 69 67  end up being sig
2d700 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20  nificantly.  ** 
2d710 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20  more expensive. 
2d720 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32   */.  assert( 42
2d730 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
2d740 31 38 29 20 29 3b 0a 20 20 69 66 28 20 73 61 76  18) );.  if( sav
2d750 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53  ed_nEq==saved_nS
2d760 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f  kip.   && saved_
2d770 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b  nEq+1<pProbe->nK
2d780 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f  eyCol.   && pPro
2d790 62 65 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d  be->noSkipScan==
2d7a0 30 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  0.   && pProbe->
2d7b0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
2d7c0 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a  d_nEq+1]>=42  /*
2d7d0 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d   TUNING: Minimum
2d7e0 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a   for skip-scan *
2d7f0 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77 68  /.   && (rc = wh
2d800 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
2d810 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
2d820 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45  Term+1))==SQLITE
2d830 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67  _OK.  ){.    Log
2d840 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70  Est nIter;.    p
2d850 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
2d860 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53  ++;.    pNew->nS
2d870 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d  kip++;.    pNew-
2d880 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
2d890 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20  Term++] = 0;.   
2d8a0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
2d8b0 3d 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  = WHERE_SKIPSCAN
2d8c0 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d 20 70 50  ;.    nIter = pP
2d8d0 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
2d8e0 74 5b 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70  t[saved_nEq] - p
2d8f0 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
2d900 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b  st[saved_nEq+1];
2d910 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
2d920 2d 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a  -= nIter;.    /*
2d930 20 54 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73   TUNING:  Becaus
2d940 65 20 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20  e uncertainties 
2d950 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 73  in the estimates
2d960 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71   for skip-scan q
2d970 75 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61  ueries,.    ** a
2d980 64 64 20 61 20 31 2e 33 37 35 20 66 75 64 67 65  dd a 1.375 fudge
2d990 20 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20   factor to make 
2d9a0 73 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74  skip-scan slight
2d9b0 6c 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20  ly less likely. 
2d9c0 2a 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20  */.    nIter += 
2d9d0 35 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  5;.    whereLoop
2d9e0 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
2d9f0 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
2da00 72 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49  robe, nIter + nI
2da10 6e 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d  nMul);.    pNew-
2da20 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
2da30 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ut;.    pNew->u.
2da40 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65  btree.nEq = save
2da50 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d  d_nEq;.    pNew-
2da60 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e  >nSkip = saved_n
2da70 53 6b 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Skip;.    pNew->
2da80 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
2da90 77 73 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  wsFlags;.  }..  
2daa0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2dab0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20  .** Return True 
2dac0 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
2dad0 65 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69  e that pIndex mi
2dae0 67 68 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e  ght be useful in
2daf0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  .** implementing
2db00 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2db10 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72  ause in pBuilder
2db20 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46  ..**.** Return F
2db30 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65 72  alse if pBuilder
2db40 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
2db50 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  n an ORDER BY cl
2db60 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68  ause or.** if th
2db70 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f  ere is no way fo
2db80 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75  r pIndex to be u
2db90 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65  seful in impleme
2dba0 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52  nting that.** OR
2dbb0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
2dbc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64  /.static int ind
2dbd0 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f  exMightHelpWithO
2dbe0 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c  rderBy(.  WhereL
2dbf0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
2dc00 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70  lder,.  Index *p
2dc10 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75  Index,.  int iCu
2dc20 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69  rsor.){.  ExprLi
2dc30 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69  st *pOB;.  int i
2dc40 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49  i, jj;..  if( pI
2dc50 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  ndex->bUnordered
2dc60 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
2dc70 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64  f( (pOB = pBuild
2dc80 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  er->pWInfo->pOrd
2dc90 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72  erBy)==0 ) retur
2dca0 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  n 0;.  for(ii=0;
2dcb0 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20   ii<pOB->nExpr; 
2dcc0 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  ii++){.    Expr 
2dcd0 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  *pExpr = sqlite3
2dce0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
2dcf0 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  pOB->a[ii].pExpr
2dd00 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
2dd10 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
2dd20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
2dd30 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
2dd40 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  e==iCursor ){.  
2dd50 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
2dd60 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
2dd70 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  n 1;.      for(j
2dd80 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e  j=0; jj<pIndex->
2dd90 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a  nKeyCol; jj++){.
2dda0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
2ddb0 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64  r->iColumn==pInd
2ddc0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d  ex->aiColumn[jj]
2ddd0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
2dde0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2ddf0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2de00 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69 74  .** Return a bit
2de10 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20 69 6e  mask where 1s in
2de20 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
2de30 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
2de40 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74  lumn of.** the t
2de50 61 62 6c 65 20 69 73 20 75 73 65 64 20 62 79 20  able is used by 
2de60 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20  an index.  Only 
2de70 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c  the first 63 col
2de80 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64 65  umns are conside
2de90 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  red..*/.static B
2dea0 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e  itmask columnsIn
2deb0 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64  Index(Index *pId
2dec0 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20  x){.  Bitmask m 
2ded0 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
2dee0 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c  for(j=pIdx->nCol
2def0 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  umn-1; j>=0; j--
2df00 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70  ){.    int x = p
2df10 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
2df20 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29  ;.    if( x>=0 )
2df30 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
2df40 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  ( x==BMS-1 );.  
2df50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
2df60 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20  =BMS-2 );.      
2df70 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20  if( x<BMS-1 ) m 
2df80 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20  |= MASKBIT(x);. 
2df90 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2dfa0 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b  n m;.}../* Check
2dfb0 20 74 6f 20 73 65 65 20 69 66 20 61 20 70 61 72   to see if a par
2dfc0 74 69 61 6c 20 69 6e 64 65 78 20 77 69 74 68 20  tial index with 
2dfd0 70 50 61 72 74 49 6e 64 65 78 57 68 65 72 65 20  pPartIndexWhere 
2dfe0 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 69  can be used.** i
2dff0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75  n the current qu
2e000 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ery.  Return tru
2e010 65 20 69 66 20 69 74 20 63 61 6e 20 62 65 20 61  e if it can be a
2e020 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
2e030 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2e040 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
2e050 6c 49 6e 64 65 78 28 69 6e 74 20 69 54 61 62 2c  lIndex(int iTab,
2e060 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
2e070 43 2c 20 45 78 70 72 20 2a 70 57 68 65 72 65 29  C, Expr *pWhere)
2e080 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
2e090 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
2e0a0 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d   for(i=0, pTerm=
2e0b0 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
2e0c0 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
2e0d0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
2e0e0 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
2e0f0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  xpr;.    if( sql
2e100 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
2e110 78 70 72 28 70 45 78 70 72 2c 20 70 57 68 65 72  xpr(pExpr, pWher
2e120 65 2c 20 69 54 61 62 29 20 0a 20 20 20 20 20 26  e, iTab) .     &
2e130 26 20 28 21 45 78 70 72 48 61 73 50 72 6f 70 65  & (!ExprHasPrope
2e140 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
2e150 6f 6d 4a 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72  omJoin) || pExpr
2e160 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2e170 65 3d 3d 69 54 61 62 29 0a 20 20 20 20 29 7b 0a  e==iTab).    ){.
2e180 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2e190 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2e1a0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
2e1b0 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
2e1c0 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 73   objects for a s
2e1d0 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74  ingle table of t
2e1e0 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20 74 68  he join where th
2e1f0 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64  e table.** is id
2e200 65 6e 66 69 65 64 20 62 79 20 70 42 75 69 6c 64  enfied by pBuild
2e210 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20  er->pNew->iTab. 
2e220 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67   That table is g
2e230 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a  uaranteed to be.
2e240 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c  ** a b-tree tabl
2e250 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  e, not a virtual
2e260 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
2e270 65 20 63 6f 73 74 73 20 28 57 68 65 72 65 4c 6f  e costs (WhereLo
2e280 6f 70 2e 72 52 75 6e 29 20 6f 66 20 74 68 65 20  op.rRun) of the 
2e290 62 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61 64 64  b-tree loops add
2e2a0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
2e2b0 69 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75  ion.** are calcu
2e2c0 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  lated as follows
2e2d0 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75  :.**.** For a fu
2e2e0 6c 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e  ll scan, assumin
2e2f0 67 20 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20  g the table (or 
2e300 69 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e 73 20  index) contains 
2e310 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a  nRow rows:.**.**
2e320 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77       cost = nRow
2e330 20 2a 20 33 2e 30 20 20 20 20 20 20 20 20 20 20   * 3.0          
2e340 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66 75 6c            // ful
2e350 6c 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20  l-table scan.** 
2e360 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20      cost = nRow 
2e370 2a 20 4b 20 20 20 20 20 20 20 20 20 20 20 20 20  * K             
2e380 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e           // scan
2e390 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64   of covering ind
2e3a0 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d  ex.**     cost =
2e3b0 20 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20   nRow * (K+3.0) 
2e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e3d0 2f 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f  / scan of non-co
2e3e0 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a  vering index.**.
2e3f0 2a 2a 20 77 68 65 72 65 20 4b 20 69 73 20 61 20  ** where K is a 
2e400 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e  value between 1.
2e410 31 20 61 6e 64 20 33 2e 30 20 73 65 74 20 62 61  1 and 3.0 set ba
2e420 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74  sed on the relat
2e430 69 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65  ive .** estimate
2e440 64 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f  d average size o
2e450 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
2e460 74 61 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a  table records..*
2e470 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65  *.** For an inde
2e480 78 20 73 63 61 6e 2c 20 77 68 65 72 65 20 6e 56  x scan, where nV
2e490 69 73 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62  isit is the numb
2e4a0 65 72 20 6f 66 20 69 6e 64 65 78 20 72 6f 77 73  er of index rows
2e4b0 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 74   visited.** by t
2e4c0 68 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65  he scan, and nSe
2e4d0 65 6b 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ek is the number
2e4e0 20 6f 66 20 73 65 65 6b 20 6f 70 65 72 61 74 69   of seek operati
2e4f0 6f 6e 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20  ons required on 
2e500 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 62 2d  .** the index b-
2e510 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  tree:.**.**     
2e520 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28  cost = nSeek * (
2e530 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20  log(nRow) + K * 
2e540 6e 56 69 73 69 74 29 20 20 20 20 20 20 20 20 20  nVisit)         
2e550 20 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e 64   // covering ind
2e560 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d  ex.**     cost =
2e570 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52   nSeek * (log(nR
2e580 6f 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20  ow) + (K+3.0) * 
2e590 6e 56 69 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f  nVisit)    // no
2e5a0 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
2e5b0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
2e5c0 20 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e 53 65   nSeek is 1. nSe
2e5d0 65 6b 20 76 61 6c 75 65 73 20 67 72 65 61 74 65  ek values greate
2e5e0 72 20 74 68 61 6e 20 31 20 63 6f 6d 65 20 61 62  r than 1 come ab
2e5f0 6f 75 74 20 69 66 20 74 68 65 20 0a 2a 2a 20 57  out if the .** W
2e600 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 63 6c  HERE clause incl
2e610 75 64 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e  udes "x IN (....
2e620 29 22 20 74 65 72 6d 73 20 75 73 65 64 20 69 6e  )" terms used in
2e630 20 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e   place of "x=?".
2e640 20 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70   Or when .** imp
2e650 6c 69 63 69 74 20 22 78 20 49 4e 20 28 53 45 4c  licit "x IN (SEL
2e660 45 43 54 20 78 20 46 52 4f 4d 20 74 62 6c 29 22  ECT x FROM tbl)"
2e670 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64   terms are added
2e680 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e   for skip-scans.
2e690 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d  .**.** The estim
2e6a0 61 74 65 64 20 76 61 6c 75 65 73 20 28 6e 52 6f  ated values (nRo
2e6b0 77 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b  w, nVisit, nSeek
2e6c0 29 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20  ) often contain 
2e6d0 61 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a  a large amount.*
2e6e0 2a 20 6f 66 20 75 6e 63 65 72 74 61 69 6e 74 79  * of uncertainty
2e6f0 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  .  For this reas
2e700 6f 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73 20 64  on, scoring is d
2e710 65 73 69 67 6e 65 64 20 74 6f 20 70 69 63 6b 20  esigned to pick 
2e720 70 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64  plans that.** "d
2e730 6f 20 74 68 65 20 6c 65 61 73 74 20 68 61 72 6d  o the least harm
2e740 22 20 69 66 20 74 68 65 20 65 73 74 69 6d 61 74  " if the estimat
2e750 65 73 20 61 72 65 20 69 6e 61 63 63 75 72 61 74  es are inaccurat
2e760 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  e.  For example,
2e770 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20   a.** log(nRow) 
2e780 66 61 63 74 6f 72 20 69 73 20 6f 6d 69 74 74 65  factor is omitte
2e790 64 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76  d from a non-cov
2e7a0 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e  ering index scan
2e7b0 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20   in order to.** 
2e7c0 62 69 61 73 20 74 68 65 20 73 63 6f 72 69 6e 67  bias the scoring
2e7d0 20 69 6e 20 66 61 76 6f 72 20 6f 66 20 75 73 69   in favor of usi
2e7e0 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e  ng an index, sin
2e7f0 63 65 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73  ce the worst-cas
2e800 65 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65  e.** performance
2e810 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64   of using an ind
2e820 65 78 20 69 73 20 66 61 72 20 62 65 74 74 65 72  ex is far better
2e830 20 74 68 61 6e 20 74 68 65 20 77 6f 72 73 74 2d   than the worst-
2e840 63 61 73 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  case performance
2e850 0a 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74 61  .** of a full ta
2e860 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61  ble scan..*/.sta
2e870 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
2e880 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65  pAddBtree(.  Whe
2e890 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
2e8a0 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52  Builder, /* WHER
2e8b0 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
2e8c0 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
2e8d0 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20  k mExtra        
2e8e0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70        /* Extra p
2e8f0 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72  rerequesites for
2e900 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c   using this tabl
2e910 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  e */.){.  WhereI
2e920 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
2e930 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
2e940 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
2e950 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
2e960 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
2e970 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20   /* An index we 
2e980 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a  are evaluating *
2e990 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20  /.  Index sPk;  
2e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9b0 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20  /* A fake index 
2e9c0 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70  object for the p
2e9d0 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
2e9e0 4c 6f 67 45 73 74 20 61 69 52 6f 77 45 73 74 50  LogEst aiRowEstP
2e9f0 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54  k[2];       /* T
2ea00 68 65 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d  he aiRowLogEst[]
2ea10 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
2ea20 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31  Pk index */.  i1
2ea30 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d  6 aiColumnPk = -
2ea40 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  1;        /* The
2ea50 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65   aColumn[] value
2ea60 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64   for the sPk ind
2ea70 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ex */.  SrcList 
2ea80 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20  *pTabList;      
2ea90 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
2eaa0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
2eab0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2eac0 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46  *pSrc;  /* The F
2ead0 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65  ROM clause btree
2eae0 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a   term to add */.
2eaf0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
2eb00 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w;            /*
2eb10 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
2eb20 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
2eb30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2eb40 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52  OK;         /* R
2eb50 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2eb60 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31  int iSortIdx = 1
2eb70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
2eb80 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
2eb90 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20   int b;         
2eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ebb0 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20  A boolean value 
2ebc0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a  */.  LogEst rSiz
2ebd0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2ebe0 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f   /* number of ro
2ebf0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
2ec00 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
2ec10 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2ec20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66   /* Logarithm of
2ec30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2ec40 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
2ec50 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
2ec60 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
2ec70 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20    /* The parsed 
2ec80 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
2ec90 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
2eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ecb0 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   Table being que
2ecc0 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65  ried */.  .  pNe
2ecd0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
2ece0 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70  ew;.  pWInfo = p
2ecf0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
2ed00 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57  .  pTabList = pW
2ed10 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
2ed20 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73    pSrc = pTabLis
2ed30 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
2ed40 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  b;.  pTab = pSrc
2ed50 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20  ->pTab;.  pWC = 
2ed60 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
2ed70 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74   assert( !IsVirt
2ed80 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20  ual(pSrc->pTab) 
2ed90 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  );..  if( pSrc->
2eda0 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a  pIndex ){.    /*
2edb0 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   An INDEXED BY c
2edc0 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20  lause specifies 
2edd0 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
2ede0 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  ex to use */.   
2edf0 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
2ee00 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20  pIndex;.  }else 
2ee10 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
2ee20 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62  ab) ){.    pProb
2ee30 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  e = pTab->pIndex
2ee40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
2ee50 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
2ee60 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
2ee70 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
2ee80 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
2ee90 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
2eea0 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70  iable sPk to rep
2eeb0 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64  resent the rowid
2eec0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
2eed0 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20  ex.  Make this. 
2eee0 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78     ** fake index
2eef0 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
2ef00 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f  chain of Index o
2ef10 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20  bjects with all 
2ef20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20  of the real.    
2ef30 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f  ** indices to fo
2ef40 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65  llow */.    Inde
2ef50 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  x *pFirst;      
2ef60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2ef70 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64  irst of real ind
2ef80 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
2ef90 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  e */.    memset(
2efa0 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sPk, 0, sizeof(
2efb0 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b  Index));.    sPk
2efc0 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20  .nKeyCol = 1;.  
2efd0 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20    sPk.nColumn = 
2efe0 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c  1;.    sPk.aiCol
2eff0 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50  umn = &aiColumnP
2f000 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77  k;.    sPk.aiRow
2f010 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73  LogEst = aiRowEs
2f020 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
2f030 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
2f040 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
2f050 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50  e = pTab;.    sP
2f060 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61  k.szIdxRow = pTa
2f070 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
2f080 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d   aiRowEstPk[0] =
2f090 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
2f0a0 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  t;.    aiRowEstP
2f0b0 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46  k[1] = 0;.    pF
2f0c0 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61  irst = pSrc->pTa
2f0d0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  b->pIndex;.    i
2f0e0 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65  f( pSrc->notInde
2f0f0 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xed==0 ){.      
2f100 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69  /* The real indi
2f110 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ces of the table
2f120 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64   are only consid
2f130 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20  ered if the.    
2f140 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44    ** NOT INDEXED
2f150 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d   qualifier is om
2f160 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46  itted from the F
2f170 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
2f180 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20      sPk.pNext = 
2f190 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20  pFirst;.    }.  
2f1a0 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b    pProbe = &sPk;
2f1b0 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70  .  }.  rSize = p
2f1c0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  Tab->nRowLogEst;
2f1d0 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
2f1e0 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69  tLog(rSize);..#i
2f1f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f200 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
2f210 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63  X.  /* Automatic
2f220 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66   indexes */.  if
2f230 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  ( !pBuilder->pOr
2f240 53 65 74 0a 20 20 20 26 26 20 28 70 57 49 6e 66  Set.   && (pWInf
2f250 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
2f260 57 48 45 52 45 5f 4e 4f 5f 41 55 54 4f 49 4e 44  WHERE_NO_AUTOIND
2f270 45 58 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 57  EX)==0.   && (pW
2f280 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
2f290 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2f2a0 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20  _AutoIndex)!=0. 
2f2b0 20 20 26 26 20 70 53 72 63 2d 3e 70 49 6e 64 65    && pSrc->pInde
2f2c0 78 3d 3d 30 0a 20 20 20 26 26 20 21 70 53 72 63  x==0.   && !pSrc
2f2d0 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20  ->viaCoroutine. 
2f2e0 20 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49    && !pSrc->notI
2f2f0 6e 64 65 78 65 64 0a 20 20 20 26 26 20 48 61 73  ndexed.   && Has
2f300 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 26  Rowid(pTab).   &
2f310 26 20 21 70 53 72 63 2d 3e 69 73 43 6f 72 72 65  & !pSrc->isCorre
2f320 6c 61 74 65 64 0a 20 20 20 26 26 20 21 70 53 72  lated.   && !pSr
2f330 63 2d 3e 69 73 52 65 63 75 72 73 69 76 65 0a 20  c->isRecursive. 
2f340 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72   ){.    /* Gener
2f350 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57  ate auto-index W
2f360 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20  hereLoops */.   
2f370 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
2f380 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  m;.    WhereTerm
2f390 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e   *pWCEnd = pWC->
2f3a0 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  a + pWC->nTerm;.
2f3b0 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
2f3c0 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45  C->a; rc==SQLITE
2f3d0 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43  _OK && pTerm<pWC
2f3e0 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
2f3f0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
2f400 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e  prereqRight & pN
2f410 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63  ew->maskSelf ) c
2f420 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
2f430 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
2f440 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
2f450 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
2f460 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
2f470 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  q = 1;.        p
2f480 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a  New->nSkip = 0;.
2f490 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
2f4a0 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
2f4b0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2f4c0 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
2f4d0 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
2f4e0 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
2f4f0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
2f500 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f  One-time cost fo
2f510 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20  r computing the 
2f520 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
2f530 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 73  is.        ** es
2f540 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20 58 2a  timated to be X*
2f550 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20  N*log2(N) where 
2f560 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
2f570 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20  of rows in.     
2f580 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20     ** the table 
2f590 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 61 6e  being indexed an
2f5a0 64 20 77 68 65 72 65 20 58 20 69 73 20 37 20 28  d where X is 7 (
2f5b0 4c 6f 67 45 73 74 3d 32 38 29 20 66 6f 72 20 6e  LogEst=28) for n
2f5c0 6f 72 6d 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  ormal.        **
2f5d0 20 74 61 62 6c 65 73 20 6f 72 20 31 2e 33 37 35   tables or 1.375
2f5e0 20 28 4c 6f 67 45 73 74 3d 34 29 20 66 6f 72 20   (LogEst=4) for 
2f5f0 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
2f600 72 69 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65  ries.  The value
2f610 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 58  .        ** of X
2f620 20 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20   is smaller for 
2f630 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
2f640 72 69 65 73 20 73 6f 20 74 68 61 74 20 74 68 65  ries so that the
2f650 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20   query planner. 
2f660 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62         ** will b
2f670 65 20 6d 6f 72 65 20 61 67 67 72 65 73 73 69 76  e more aggressiv
2f680 65 20 61 62 6f 75 74 20 67 65 6e 65 72 61 74 69  e about generati
2f690 6e 67 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  ng automatic ind
2f6a0 65 78 65 73 20 66 6f 72 0a 20 20 20 20 20 20 20  exes for.       
2f6b0 20 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65 63 74   ** those object
2f6c0 73 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  s, since there i
2f6d0 73 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79  s no opportunity
2f6e0 20 74 6f 20 61 64 64 20 73 63 68 65 6d 61 0a 20   to add schema. 
2f6f0 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 65         ** indexe
2f700 73 20 6f 6e 20 73 75 62 71 75 65 72 69 65 73 20  s on subqueries 
2f710 61 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20  and views. */.  
2f720 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
2f730 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20  up = rLogSize + 
2f740 72 53 69 7a 65 20 2b 20 34 3b 0a 20 20 20 20 20  rSize + 4;.     
2f750 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
2f760 6c 65 63 74 3d 3d 30 20 26 26 20 28 70 54 61 62  lect==0 && (pTab
2f770 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
2f780 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b  Ephemeral)==0 ){
2f790 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
2f7a0 3e 72 53 65 74 75 70 20 2b 3d 20 32 34 3b 0a 20  >rSetup += 24;. 
2f7b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f7c0 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
2f7d0 6c 69 65 72 28 70 4e 65 77 2d 3e 72 53 65 74 75  lier(pNew->rSetu
2f7e0 70 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c  p, pTab->costMul
2f7f0 74 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  t);.        /* T
2f800 55 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65  UNING: Each inde
2f810 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20  x lookup yields 
2f820 32 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  20 rows in the t
2f830 61 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20  able.  This.    
2f840 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74      ** is more t
2f850 68 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75  han the usual gu
2f860 65 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20  ess of 10 rows, 
2f870 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f  since we have no
2f880 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20   way.        ** 
2f890 6f 66 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73  of knowing how s
2f8a0 65 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e 64  elective the ind
2f8b0 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65  ex will ultimate
2f8c0 6c 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64  ly be.  It would
2f8d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
2f8e0 62 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  be unreasonable 
2f8f0 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c  to make this val
2f900 75 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20  ue much larger. 
2f910 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
2f920 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73  >nOut = 43;  ass
2f930 65 72 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33  ert( 43==sqlite3
2f940 4c 6f 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20  LogEst(20) );.  
2f950 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
2f960 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
2f970 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65  Add(rLogSize,pNe
2f980 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  w->nOut);.      
2f990 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2f9a0 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  = WHERE_AUTO_IND
2f9b0 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EX;.        pNew
2f9c0 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72  ->prereq = mExtr
2f9d0 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  a | pTerm->prere
2f9e0 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
2f9f0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
2fa00 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
2fa10 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
2fa20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
2fa30 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
2fa40 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f  TOMATIC_INDEX */
2fa50 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ..  /* Loop over
2fa60 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a   all indices.  *
2fa70 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51  /.  for(; rc==SQ
2fa80 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62  LITE_OK && pProb
2fa90 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65  e; pProbe=pProbe
2faa0 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64  ->pNext, iSortId
2fab0 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  x++){.    if( pP
2fac0 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68  robe->pPartIdxWh
2fad0 65 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21  ere!=0.     && !
2fae0 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69  whereUsableParti
2faf0 61 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e 69 43  alIndex(pSrc->iC
2fb00 75 72 73 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f  ursor, pWC, pPro
2fb10 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  be->pPartIdxWher
2fb20 65 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  e) ){.      test
2fb30 63 61 73 65 28 20 70 4e 65 77 2d 3e 69 54 61 62  case( pNew->iTab
2fb40 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
2fb50 29 3b 20 20 2f 2a 20 53 65 65 20 74 69 63 6b 65  );  /* See ticke
2fb60 74 20 5b 39 38 64 39 37 33 62 38 66 35 5d 20 2a  t [98d973b8f5] *
2fb70 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
2fb80 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e  ;  /* Partial in
2fb90 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74  dex inappropriat
2fba0 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  e for this query
2fbb0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72 53   */.    }.    rS
2fbc0 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ize = pProbe->ai
2fbd0 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20  RowLogEst[0];.  
2fbe0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
2fbf0 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  nEq = 0;.    pNe
2fc00 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20  w->nSkip = 0;.  
2fc10 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
2fc20 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53   0;.    pNew->iS
2fc30 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
2fc40 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
2fc50 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
2fc60 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20  eq = mExtra;.   
2fc70 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
2fc80 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ize;.    pNew->u
2fc90 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
2fca0 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20  pProbe;.    b = 
2fcb0 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69  indexMightHelpWi
2fcc0 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64  thOrderBy(pBuild
2fcd0 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63  er, pProbe, pSrc
2fce0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2fcf0 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44  /* The ONEPASS_D
2fd00 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76  ESIRED flags nev
2fd10 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68  er occurs togeth
2fd20 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59  er with ORDER BY
2fd30 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2fd40 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2fd50 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2fd60 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
2fd70 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69  || b==0 );.    i
2fd80 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c  f( pProbe->tnum<
2fd90 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
2fda0 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
2fdb0 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ey index */.    
2fdc0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2fdd0 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20  = WHERE_IPK;..  
2fde0 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c      /* Full tabl
2fdf0 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20  e scan */.      
2fe00 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
2fe10 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
2fe20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  0;.      /* TUNI
2fe30 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c  NG: Cost of full
2fe40 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 28   table scan is (
2fe50 4e 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20  N*3.0). */.     
2fe60 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53   pNew->rRun = rS
2fe70 69 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20 20 20  ize + 16;.      
2fe80 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
2fe90 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  ier(pNew->rRun, 
2fea0 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  pTab->costMult);
2feb0 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
2fec0 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43  OutputAdjust(pWC
2fed0 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a  , pNew, rSize);.
2fee0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2fef0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
2ff00 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
2ff10 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
2ff20 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
2ff30 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
2ff40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74  }else{.      Bit
2ff50 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66  mask m;.      if
2ff60 28 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65  ( pProbe->isCove
2ff70 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ring ){.        
2ff80 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
2ff90 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c  WHERE_IDX_ONLY |
2ffa0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a   WHERE_INDEXED;.
2ffb0 20 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20          m = 0;. 
2ffc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ffd0 20 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f      m = pSrc->co
2ffe0 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73  lUsed & ~columns
2fff0 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b  InIndex(pProbe);
30000 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
30010 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20  sFlags = (m==0) 
30020 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  ? (WHERE_IDX_ONL
30030 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  Y|WHERE_INDEXED)
30040 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   : WHERE_INDEXED
30050 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
30060 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69   /* Full scan vi
30070 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  a index */.     
30080 20 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c   if( b.       ||
30090 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
300a0 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d  .       || ( m==
300b0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  0.         && pP
300c0 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64  robe->bUnordered
300d0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
300e0 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f  (pProbe->szIdxRo
300f0 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  w<pTab->szTabRow
30100 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
30110 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
30120 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
30130 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20  S_DESIRED)==0.  
30140 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
30150 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55  3GlobalConfig.bU
30160 73 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26  seCis.         &
30170 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
30180 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50  abled(pWInfo->pP
30190 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
301a0 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20  _CoverIdxScan). 
301b0 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20           ).     
301c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
301d0 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
301e0 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a   iSortIdx : 0;..
301f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
30200 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20  ost of visiting 
30210 74 68 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69  the index rows i
30220 73 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69  s N*K, where K i
30230 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74  s.        ** bet
30240 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30  ween 1.1 and 3.0
30250 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
30260 68 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65  he relative size
30270 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  s of the.       
30280 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61   ** index and ta
30290 62 6c 65 20 72 6f 77 73 2e 20 49 66 20 74 68 69  ble rows. If thi
302a0 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  s is a non-cover
302b0 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 0a  ing index scan,.
302c0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20          ** also 
302d0 61 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 20  add the cost of 
302e0 76 69 73 69 74 69 6e 67 20 74 61 62 6c 65 20 72  visiting table r
302f0 6f 77 73 20 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f  ows (N*3.0).  */
30300 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
30310 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20  Run = rSize + 1 
30320 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a  + (15*pProbe->sz
30330 49 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a  IdxRow)/pTab->sz
30340 54 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  TabRow;.        
30350 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20  if( m!=0 ){.    
30360 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
30370 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
30380 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  Add(pNew->rRun, 
30390 72 53 69 7a 65 2b 31 36 29 3b 0a 20 20 20 20 20  rSize+16);.     
303a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70     }.        App
303b0 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
303c0 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61  (pNew->rRun, pTa
303d0 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20  b->costMult);.  
303e0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f        whereLoopO
303f0 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c  utputAdjust(pWC,
30400 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20   pNew, rSize);. 
30410 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
30420 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
30430 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
30440 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
30450 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  = rSize;.       
30460 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
30470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
30480 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
30490 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
304a0 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
304b0 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64  pProbe, 0);.#ifd
304c0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
304d0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
304e0 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 34      sqlite3Stat4
304f0 50 72 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64  ProbeFree(pBuild
30500 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70  er->pRec);.    p
30510 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
30520 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69  id = 0;.    pBui
30530 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a  lder->pRec = 0;.
30540 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
30550 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
30560 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
30570 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74  , then only that
30580 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20   one index is.  
30590 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e    ** considered.
305a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63   */.    if( pSrc
305b0 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b  ->pIndex ) break
305c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
305d0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
305e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
305f0 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64  LTABLE./*.** Add
30600 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
30610 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62  bjects for a tab
30620 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69  le of the join i
30630 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20  dentified by.** 
30640 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
30650 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
30660 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
30670 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20  to be a virtual 
30680 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
30690 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
306a0 64 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72  dVirtual(.  Wher
306b0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
306c0 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52  uilder,  /* WHER
306d0 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
306e0 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
306f0 6b 20 6d 45 78 74 72 61 0a 29 7b 0a 20 20 57 68  k mExtra.){.  Wh
30700 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
30710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
30720 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e  ERE analysis con
30730 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
30740 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
30750 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
30760 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
30770 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
30780 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
30790 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
307a0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
307b0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
307c0 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
307d0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
307e0 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62   search */.  Tab
307f0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69  le *pTab;.  sqli
30800 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74  te3 *db;.  sqlit
30810 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
30820 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63  IdxInfo;.  struc
30830 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
30840 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
30850 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
30860 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
30870 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
30880 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
30890 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
308a0 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65   i, j;.  int iTe
308b0 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e  rm, mxTerm;.  in
308c0 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  t nConstraint;. 
308d0 20 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b   int seenIn = 0;
308e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
308f0 20 54 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f   True if an IN o
30900 70 65 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20  perator is seen 
30910 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72  */.  int seenVar
30920 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
30930 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e    /* True if a n
30940 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73  on-constant cons
30950 74 72 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a  traint is seen *
30960 2f 0a 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20  /.  int iPhase; 
30970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30980 20 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f   /* 0: const w/o
30990 20 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32   IN, 1: const, 2
309a0 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20  : no IN,  2: IN 
309b0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
309c0 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pNew;.  int rc =
309d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70   SQLITE_OK;..  p
309e0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
309f0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72  ->pWInfo;.  pPar
30a00 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
30a10 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
30a20 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20  se->db;.  pWC = 
30a30 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
30a40 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
30a50 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d  ->pNew;.  pSrc =
30a60 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
30a70 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62  st->a[pNew->iTab
30a80 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  ];.  pTab = pSrc
30a90 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74  ->pTab;.  assert
30aa0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
30ab0 29 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20  ) );.  pIdxInfo 
30ac0 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49  = allocateIndexI
30ad0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c  nfo(pParse, pWC,
30ae0 20 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d   pSrc, pBuilder-
30af0 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  >pOrderBy);.  if
30b00 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20  ( pIdxInfo==0 ) 
30b10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
30b20 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65  MEM;.  pNew->pre
30b30 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  req = 0;.  pNew-
30b40 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70  >rSetup = 0;.  p
30b50 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
30b60 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
30b70 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  E;.  pNew->nLTer
30b80 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75  m = 0;.  pNew->u
30b90 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
30ba0 20 30 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70   0;.  pUsage = p
30bb0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
30bc0 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f  aintUsage;.  nCo
30bd0 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49  nstraint = pIdxI
30be0 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
30bf0 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  ;.  if( whereLoo
30c00 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77  pResize(db, pNew
30c10 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29  , nConstraint) )
30c20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
30c30 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f  ree(db, pIdxInfo
30c40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
30c50 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
30c60 0a 20 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b  .  for(iPhase=0;
30c70 20 69 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61   iPhase<=3; iPha
30c80 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21  se++){.    if( !
30c90 73 65 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73  seenIn && (iPhas
30ca0 65 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  e&1)!=0 ){.     
30cb0 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20   iPhase++;.     
30cc0 20 69 66 28 20 69 50 68 61 73 65 3e 33 20 29 20   if( iPhase>3 ) 
30cd0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
30ce0 20 69 66 28 20 21 73 65 65 6e 56 61 72 20 26 26   if( !seenVar &&
30cf0 20 69 50 68 61 73 65 3e 31 20 29 20 62 72 65 61   iPhase>1 ) brea
30d00 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20  k;.    pIdxCons 
30d10 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
30d20 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
30d30 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
30d40 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
30d50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
30d60 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
30d70 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e  nt; i++, pIdxCon
30d80 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20  s++){.      j = 
30d90 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
30da0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65  ffset;.      pTe
30db0 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b  rm = &pWC->a[j];
30dc0 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 69  .      switch( i
30dd0 50 68 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20  Phase ){.       
30de0 20 63 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43   case 0:    /* C
30df0 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74  onstants without
30e00 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
30e10 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
30e20 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a  ns->usable = 0;.
30e30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
30e40 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
30e50 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20  & WO_IN)!=0 ){. 
30e60 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 49             seenI
30e70 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
30e80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
30e90 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
30ea0 67 68 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ght!=0 ){.      
30eb0 20 20 20 20 20 20 73 65 65 6e 56 61 72 20 3d 20        seenVar = 
30ec0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
30ed0 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  se if( (pTerm->e
30ee0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
30ef0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
30f00 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
30f10 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
30f20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30f30 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
30f40 61 73 65 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e  ase 1:    /* Con
30f50 73 74 61 6e 74 73 20 77 69 74 68 20 49 4e 20 6f  stants with IN o
30f60 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20  perators */.    
30f70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
30f80 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  enIn );.        
30f90 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
30fa0 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65  le = (pTerm->pre
30fb0 72 65 71 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20  reqRight==0);.  
30fc0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
30fd0 20 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 20         case 2:  
30fe0 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77    /* Variables w
30ff0 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20  ithout IN */.   
31000 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
31010 65 65 6e 56 61 72 20 29 3b 0a 20 20 20 20 20 20  eenVar );.      
31020 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
31030 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65  able = (pTerm->e
31040 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
31050 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )==0;.          
31060 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64  break;.        d
31070 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72  efault:   /* Var
31080 69 61 62 6c 65 73 20 77 69 74 68 20 49 4e 20 2a  iables with IN *
31090 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
310a0 72 74 28 20 73 65 65 6e 56 61 72 20 26 26 20 73  rt( seenVar && s
310b0 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20  eenIn );.       
310c0 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
310d0 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ble = 1;.       
310e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
310f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  }.    }.    mems
31100 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69  et(pUsage, 0, si
31110 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a  zeof(pUsage[0])*
31120 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
31130 72 61 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  raint);.    if( 
31140 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
31150 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c  FreeIdxStr ) sql
31160 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
31170 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20  fo->idxStr);.   
31180 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74   pIdxInfo->idxSt
31190 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  r = 0;.    pIdxI
311a0 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b  nfo->idxNum = 0;
311b0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  .    pIdxInfo->n
311c0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
311d0 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
311e0 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
311f0 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  ed = 0;.    pIdx
31200 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
31210 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
31220 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32  _DBL / (double)2
31230 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
31240 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20  estimatedRows = 
31250 32 35 3b 0a 20 20 20 20 72 63 20 3d 20 76 74 61  25;.    rc = vta
31260 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73  bBestIndex(pPars
31270 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66  e, pTab, pIdxInf
31280 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
31290 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
312a0 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
312b0 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
312c0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
312d0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
312e0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
312f0 74 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77  traint;.    pNew
31300 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72  ->prereq = mExtr
31310 61 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20  a;.    mxTerm = 
31320 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
31330 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43  pNew->nLSlot>=nC
31340 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20  onstraint );.   
31350 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
31360 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e  straint; i++) pN
31370 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20  ew->aLTerm[i] = 
31380 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  0;.    pNew->u.v
31390 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30  tab.omitMask = 0
313a0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
313b0 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  <nConstraint; i+
313c0 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
313d0 20 20 20 20 20 20 69 66 28 20 28 69 54 65 72 6d        if( (iTerm
313e0 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67   = pUsage[i].arg
313f0 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29  vIndex - 1)>=0 )
31400 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49  {.        j = pI
31410 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
31420 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  set;.        if(
31430 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61   iTerm>=nConstra
31440 69 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  int.         || 
31450 6a 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  j<0.         || 
31460 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20  j>=pWC->nTerm.  
31470 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e         || pNew->
31480 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30  aLTerm[iTerm]!=0
31490 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
314a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
314b0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
314c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
314d0 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78  sg(pParse, "%s.x
314e0 42 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66  BestIndex() malf
314f0 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e  unction", pTab->
31500 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
31510 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70    goto whereLoop
31520 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20  AddVtab_exit;.  
31530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31540 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d  testcase( iTerm=
31550 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29  =nConstraint-1 )
31560 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
31570 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20  se( j==0 );.    
31580 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
31590 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b  =pWC->nTerm-1 );
315a0 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
315b0 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20   &pWC->a[j];.   
315c0 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
315d0 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  q |= pTerm->prer
315e0 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
315f0 20 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70   assert( iTerm<p
31600 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
31610 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
31620 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65  erm[iTerm] = pTe
31630 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
31640 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d  iTerm>mxTerm ) m
31650 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20  xTerm = iTerm;. 
31660 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
31670 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20   iTerm==15 );.  
31680 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
31690 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20  iTerm==16 );.   
316a0 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31       if( iTerm<1
316b0 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f  6 && pUsage[i].o
316c0 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74  mit ) pNew->u.vt
316d0 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31  ab.omitMask |= 1
316e0 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  <<iTerm;.       
316f0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
31700 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21  erator & WO_IN)!
31710 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
31720 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d  if( pUsage[i].om
31730 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
31740 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
31750 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e  ttempt to use an
31760 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69   IN constraint i
31770 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
31780 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
31790 2a 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65  ** says that the
317a0 20 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63   equivalent EQ c
317b0 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
317c0 20 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74   be safely omitt
317d0 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed..            
317e0 2a 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65  ** If we do atte
317f0 6d 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20  mpt to use such 
31800 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f  a constraint, so
31810 6d 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65  me rows might be
31820 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
31830 72 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20  repeated in the 
31840 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20  output. */.     
31850 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
31860 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31870 20 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c      /* A virtual
31880 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63   table that is c
31890 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e  onstrained by an
318a0 20 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e   IN clause may n
318b0 6f 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ot.          ** 
318c0 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45  consume the ORDE
318d0 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61  R BY clause beca
318e0 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65  use (1) the orde
318f0 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20  r of IN terms.  
31900 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
31910 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65  t necessarily re
31920 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64  lated to the ord
31930 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72  er of output ter
31940 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ms and.         
31950 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65   ** (2) Multiple
31960 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20   outputs from a 
31970 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20  single IN value 
31980 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20  will not merge. 
31990 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65           ** toge
319a0 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ther.  */.      
319b0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72      pIdxInfo->or
319c0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
319d0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
319e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
319f0 66 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e  f( i>=nConstrain
31a00 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  t ){.      pNew-
31a10 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d  >nLTerm = mxTerm
31a20 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
31a30 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d  ( pNew->nLTerm<=
31a40 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a  pNew->nLSlot );.
31a50 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
31a60 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78  ab.idxNum = pIdx
31a70 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20  Info->idxNum;.  
31a80 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
31a90 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78  .needFree = pIdx
31aa0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
31ab0 49 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49  IdxStr;.      pI
31ac0 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
31ad0 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
31ae0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
31af0 2e 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e  .idxStr = pIdxIn
31b00 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20  fo->idxStr;.    
31b10 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
31b20 73 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29 28  sOrdered = (i8)(
31b30 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
31b40 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20  yConsumed ?.    
31b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b70 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64    pIdxInfo->nOrd
31b80 65 72 42 79 20 3a 20 30 29 3b 0a 20 20 20 20 20  erBy : 0);.     
31b90 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
31ba0 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  0;.      pNew->r
31bb0 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
31bc0 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49  EstFromDouble(pI
31bd0 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
31be0 64 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 70 4e  dCost);.      pN
31bf0 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74  ew->nOut = sqlit
31c00 65 33 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66  e3LogEst(pIdxInf
31c10 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
31c20 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
31c30 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
31c40 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
31c50 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  if( pNew->u.vtab
31c60 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
31c70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
31c80 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69  e(pNew->u.vtab.i
31c90 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20  dxStr);.        
31ca0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
31cb0 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  dFree = 0;.     
31cc0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a   }.    }.  }  ..
31cd0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
31ce0 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64  _exit:.  if( pId
31cf0 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
31d00 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
31d10 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
31d20 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
31d30 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
31d40 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  dxInfo);.  retur
31d50 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
31d60 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
31d70 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
31d80 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f  *.** Add WhereLo
31d90 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61  op entries to ha
31da0 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20  ndle OR terms.  
31db0 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65  This works for e
31dc0 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20  ither.** btrees 
31dd0 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
31de0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
31df0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
31e00 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
31e10 20 2a 70 42 75 69 6c 64 65 72 2c 20 42 69 74 6d   *pBuilder, Bitm
31e20 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20 57  ask mExtra){.  W
31e30 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
31e40 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
31e50 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  nfo;.  WhereClau
31e60 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
31e70 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68  Loop *pNew;.  Wh
31e80 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
31e90 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72  *pWCEnd;.  int r
31ea0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
31eb0 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65   int iCur;.  Whe
31ec0 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b  reClause tempWC;
31ed0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
31ee0 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20  der sSubBuild;. 
31ef0 20 57 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d   WhereOrSet sSum
31f00 2c 20 73 43 75 72 3b 0a 20 20 73 74 72 75 63 74  , sCur;.  struct
31f10 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
31f20 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d  Item;.  .  pWC =
31f30 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
31f40 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e    pWCEnd = pWC->
31f50 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  a + pWC->nTerm;.
31f60 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
31f70 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65  r->pNew;.  memse
31f80 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65  t(&sSum, 0, size
31f90 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74  of(sSum));.  pIt
31fa0 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
31fb0 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d  bList->a + pNew-
31fc0 3e 69 54 61 62 3b 0a 20 20 69 43 75 72 20 3d 20  >iTab;.  iCur = 
31fd0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
31fe0 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
31ff0 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
32000 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
32010 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  OK; pTerm++){.  
32020 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
32030 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29  perator & WO_OR)
32040 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
32050 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  rm->u.pOrInfo->i
32060 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d  ndexable & pNew-
32070 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20  >maskSelf)!=0 . 
32080 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72     ){.      Wher
32090 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20  eClause * const 
320a0 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWC = &pTerm->
320b0 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
320c0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
320d0 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20   const pOrWCEnd 
320e0 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57  = &pOrWC->a[pOrW
320f0 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20  C->nTerm];.     
32100 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
32110 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  erm;.      int o
32120 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  nce = 1;.      i
32130 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20  nt i, j;.    .  
32140 20 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20      sSubBuild = 
32150 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20  *pBuilder;.     
32160 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65   sSubBuild.pOrde
32170 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
32180 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20  SubBuild.pOrSet 
32190 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20  = &sCur;..      
321a0 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30  WHERETRACE(0x200
321b0 2c 20 28 22 42 65 67 69 6e 20 70 72 6f 63 65 73  , ("Begin proces
321c0 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25  sing OR-clause %
321d0 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20  p\n", pTerm));. 
321e0 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d       for(pOrTerm
321f0 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65  =pOrWC->a; pOrTe
32200 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72  rm<pOrWCEnd; pOr
32210 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
32220 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65   if( (pOrTerm->e
32230 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e  Operator & WO_AN
32240 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)!=0 ){.       
32250 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43     sSubBuild.pWC
32260 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70   = &pOrTerm->u.p
32270 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  AndInfo->wc;.   
32280 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
32290 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
322a0 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20  or==iCur ){.    
322b0 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49        tempWC.pWI
322c0 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
322d0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  o;.          tem
322e0 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43  pWC.pOuter = pWC
322f0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
32300 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  WC.op = TK_AND;.
32310 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
32320 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  .nTerm = 1;.    
32330 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d        tempWC.a =
32340 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20   pOrTerm;.      
32350 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57      sSubBuild.pW
32360 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20  C = &tempWC;.   
32370 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32380 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
32390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
323a0 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69    sCur.n = 0;.#i
323b0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
323c0 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20  ENABLED.        
323d0 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30  WHERETRACE(0x200
323e0 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f  , ("OR-term %d o
323f0 66 20 25 70 20 68 61 73 20 25 64 20 73 75 62 74  f %p has %d subt
32400 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20  erms:\n", .     
32410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
32420 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57  nt)(pOrTerm-pOrW
32430 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c 20 73 53  C->a), pTerm, sS
32440 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65  ubBuild.pWC->nTe
32450 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rm));.        if
32460 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
32470 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
32480 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
32490 3b 20 69 3c 73 53 75 62 42 75 69 6c 64 2e 70 57  ; i<sSubBuild.pW
324a0 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a  C->nTerm; i++){.
324b0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
324c0 65 54 65 72 6d 50 72 69 6e 74 28 26 73 53 75 62  eTermPrint(&sSub
324d0 42 75 69 6c 64 2e 70 57 43 2d 3e 61 5b 69 5d 2c  Build.pWC->a[i],
324e0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   i);.          }
324f0 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
32500 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
32510 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
32520 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  LE.        if( I
32530 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
32540 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
32550 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
32560 70 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75  pAddVirtual(&sSu
32570 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b  bBuild, mExtra);
32580 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
32590 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
325a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
325b0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
325c0 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78  (&sSubBuild, mEx
325d0 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tra);.        }.
325e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
325f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32600 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
32610 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53 75 62  eLoopAddOr(&sSub
32620 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a  Build, mExtra);.
32630 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32640 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
32650 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e  LITE_OK || sCur.
32660 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
32670 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b  if( sCur.n==0 ){
32680 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e  .          sSum.
32690 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
326a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
326b0 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29  }else if( once )
326c0 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72  {.          wher
326d0 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26  eOrMove(&sSum, &
326e0 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20  sCur);.         
326f0 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20   once = 0;.     
32700 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32710 20 20 20 20 57 68 65 72 65 4f 72 53 65 74 20 73      WhereOrSet s
32720 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20  Prev;.          
32730 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72  whereOrMove(&sPr
32740 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20  ev, &sSum);.    
32750 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30        sSum.n = 0
32760 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
32770 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20  i=0; i<sPrev.n; 
32780 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
32790 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75    for(j=0; j<sCu
327a0 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  r.n; j++){.     
327b0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72           whereOr
327c0 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50  Insert(&sSum, sP
327d0 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20  rev.a[i].prereq 
327e0 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72  | sCur.a[j].prer
327f0 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eq,.            
32800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32810 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
32820 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e  (sPrev.a[i].rRun
32830 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e  , sCur.a[j].rRun
32840 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
32850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
32860 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
32870 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c  sPrev.a[i].nOut,
32880 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29   sCur.a[j].nOut)
32890 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
328a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
328b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
328c0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
328d0 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65  m = 1;.      pNe
328e0 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  w->aLTerm[0] = p
328f0 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77  Term;.      pNew
32900 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
32910 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20  E_MULTI_OR;.    
32920 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
32930 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
32940 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20  iSortIdx = 0;.  
32950 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77      memset(&pNew
32960 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ->u, 0, sizeof(p
32970 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20  New->u));.      
32980 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
32990 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d  ITE_OK && i<sSum
329a0 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
329b0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 75 72    /* TUNING: Cur
329c0 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61 5b 69 5d  rently sSum.a[i]
329d0 2e 72 52 75 6e 20 69 73 20 73 65 74 20 74 6f 20  .rRun is set to 
329e0 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 63  the sum of the c
329f0 6f 73 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  osts.        ** 
32a00 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63 61 6e 73  of all sub-scans
32a10 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
32a20 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77 65 76 65   OR-scan. Howeve
32a30 72 2c 20 64 75 65 20 74 6f 20 72 6f 75 6e 64 69  r, due to roundi
32a40 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72  ng.        ** er
32a50 72 6f 72 73 2c 20 69 74 20 6d 61 79 20 62 65 20  rors, it may be 
32a60 74 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66  that the cost of
32a70 20 74 68 65 20 4f 52 2d 73 63 61 6e 20 69 73 20   the OR-scan is 
32a80 65 71 75 61 6c 20 74 6f 20 69 74 73 0a 20 20 20  equal to its.   
32a90 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20 65 78 70       ** most exp
32aa0 65 6e 73 69 76 65 20 73 75 62 2d 73 63 61 6e 2e  ensive sub-scan.
32ab0 20 41 64 64 20 74 68 65 20 73 6d 61 6c 6c 65 73   Add the smalles
32ac0 74 20 70 6f 73 73 69 62 6c 65 20 70 65 6e 61 6c  t possible penal
32ad0 74 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  ty .        ** (
32ae0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6d 75  equivalent to mu
32af0 6c 74 69 70 6c 79 69 6e 67 20 74 68 65 20 63 6f  ltiplying the co
32b00 73 74 20 62 79 20 31 2e 30 37 29 20 74 6f 20 65  st by 1.07) to e
32b10 6e 73 75 72 65 20 74 68 61 74 20 0a 20 20 20 20  nsure that .    
32b20 20 20 20 20 2a 2a 20 74 68 69 73 20 64 6f 65 73      ** this does
32b30 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20 4f 74 68   not happen. Oth
32b40 65 72 77 69 73 65 2c 20 66 6f 72 20 57 48 45 52  erwise, for WHER
32b50 45 20 63 6c 61 75 73 65 73 20 73 75 63 68 20 61  E clauses such a
32b60 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
32b70 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 65 72 65   following where
32b80 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64   there is an ind
32b90 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20 20 20 20  ex on "y":.     
32ba0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
32bb0 20 20 20 20 20 57 48 45 52 45 20 6c 69 6b 65 6c       WHERE likel
32bc0 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39 39 29  ihood(x=?, 0.99)
32bd0 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20 20 20 20   OR y=?.        
32be0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  **.        ** th
32bf0 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79 20 65 6c  e planner may el
32c00 65 63 74 20 74 6f 20 22 4f 52 22 20 74 6f 67 65  ect to "OR" toge
32c10 74 68 65 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c  ther a full-tabl
32c20 65 20 73 63 61 6e 20 61 6e 64 20 61 6e 0a 20 20  e scan and an.  
32c30 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 6c        ** index l
32c40 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74 68 65 72  ookup. And other
32c50 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64 64 20 72   similarly odd r
32c60 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20  esults.  */.    
32c70 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
32c80 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20   sSum.a[i].rRun 
32c90 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  + 1;.        pNe
32ca0 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61  w->nOut = sSum.a
32cb0 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20  [i].nOut;.      
32cc0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
32cd0 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65   sSum.a[i].prere
32ce0 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  q;.        rc = 
32cf0 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
32d00 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
32d10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57  .      }.      W
32d20 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c  HERETRACE(0x200,
32d30 20 28 22 45 6e 64 20 70 72 6f 63 65 73 73 69 6e   ("End processin
32d40 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e  g OR-clause %p\n
32d50 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20  ", pTerm));.    
32d60 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
32d70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
32d80 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
32d90 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61  jects for all ta
32da0 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20  bles .*/.static 
32db0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
32dc0 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  All(WhereLoopBui
32dd0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b  lder *pBuilder){
32de0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
32df0 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
32e00 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61  >pWInfo;.  Bitma
32e10 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20  sk mExtra = 0;. 
32e20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20   Bitmask mPrior 
32e30 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
32e40 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
32e50 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
32e60 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  TabList;.  struc
32e70 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
32e80 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
32e90 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   *db = pWInfo->p
32ea0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
32eb0 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e   nTabList = pWIn
32ec0 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e  fo->nLevel;.  in
32ed0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
32ee0 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e  ;.  u8 priorJoin
32ef0 54 79 70 65 20 3d 20 30 3b 0a 20 20 57 68 65 72  Type = 0;.  Wher
32f00 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20  eLoop *pNew;..  
32f10 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65  /* Loop over the
32f20 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
32f30 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  oin, from left t
32f40 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65  o right */.  pNe
32f50 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
32f60 65 77 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30  ew;.  for(iTab=0
32f70 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74  , pItem=pTabList
32f80 2d 3e 61 3b 20 69 54 61 62 3c 6e 54 61 62 4c 69  ->a; iTab<nTabLi
32f90 73 74 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74 65  st; iTab++, pIte
32fa0 6d 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  m++){.    pNew->
32fb0 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20  iTab = iTab;.   
32fc0 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
32fd0 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  = getMask(&pWInf
32fe0 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74  o->sMaskSet, pIt
32ff0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
33000 20 20 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 6a    if( ((pItem->j
33010 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69  ointype|priorJoi
33020 6e 54 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46  nType) & (JT_LEF
33030 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20  T|JT_CROSS))!=0 
33040 29 7b 0a 20 20 20 20 20 20 6d 45 78 74 72 61 20  ){.      mExtra 
33050 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a  = mPrior;.    }.
33060 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70      priorJoinTyp
33070 65 20 3d 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74  e = pItem->joint
33080 79 70 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56  ype;.    if( IsV
33090 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54  irtual(pItem->pT
330a0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ab) ){.      rc 
330b0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
330c0 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c 20  rtual(pBuilder, 
330d0 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 65 6c  mExtra);.    }el
330e0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  se{.      rc = w
330f0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
33100 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
33110 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  a);.    }.    if
33120 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33130 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  ){.      rc = wh
33140 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75  ereLoopAddOr(pBu
33150 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
33160 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72      }.    mPrior
33170 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   |= pNew->maskSe
33180 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c  lf;.    if( rc |
33190 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
331a0 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ed ) break;.  }.
331b0 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
331c0 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  (db, pNew);.  re
331d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
331e0 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72  * Examine a Wher
331f0 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65 20  ePath (with the 
33200 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  addition of the 
33210 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20  extra WhereLoop 
33220 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61  of the 5th.** pa
33230 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65  rameters) to see
33240 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20 72   if it outputs r
33250 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 65  ows in the reque
33260 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a  sted ORDER BY.**
33270 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77   (or GROUP BY) w
33280 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67  ithout requiring
33290 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74   a separate sort
332a0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74   operation.  Ret
332b0 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  urn N:.** .**   
332c0 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73 20 6f  N>0:   N terms o
332d0 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
332e0 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73 66  lause are satisf
332f0 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20  ied.**   N==0:  
33300 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  No terms of the 
33310 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
33320 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
33330 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77     N<0:   Unknow
33340 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e 79 20 74  n yet how many t
33350 65 72 6d 73 20 6f 66 20 4f 52 44 45 52 20 42 59  erms of ORDER BY
33360 20 6d 69 67 68 74 20 62 65 20 73 61 74 69 73 66   might be satisf
33370 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  ied.   .**.** No
33380 74 65 20 74 68 61 74 20 70 72 6f 63 65 73 73 69  te that processi
33390 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52 4f  ng for WHERE_GRO
333a0 55 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f 44  UPBY and WHERE_D
333b0 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f 74  ISTINCTBY is not
333c0 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20   as.** strict.  
333d0 57 69 74 68 20 47 52 4f 55 50 20 42 59 20 61 6e  With GROUP BY an
333e0 64 20 44 49 53 54 49 4e 43 54 20 74 68 65 20 6f  d DISTINCT the o
333f0 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74 20  nly requirement 
33400 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69 76  is that.** equiv
33410 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65 61  alent rows appea
33420 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 64  r immediately ad
33430 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e  jacent to one an
33440 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42 59  other.  GROUP BY
33450 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 43 54  .** and DISTINCT
33460 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20   do not require 
33470 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20 69  rows to appear i
33480 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  n any particular
33490 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a   order as long.*
334a0 2a 20 61 73 20 65 71 75 69 76 61 6c 65 6e 74 20  * as equivalent 
334b0 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65 64  rows are grouped
334c0 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73   together.  Thus
334d0 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e   for GROUP BY an
334e0 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68  d DISTINCT.** th
334f0 65 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73  e pOrderBy terms
33500 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20   can be matched 
33510 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57  in any order.  W
33520 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68  ith ORDER BY, th
33530 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74  e .** pOrderBy t
33540 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74  erms must be mat
33550 63 68 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c  ched in strict l
33560 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64  eft-to-right ord
33570 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 38  er..*/.static i8
33580 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
33590 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57 68  iesOrderBy(.  Wh
335a0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
335b0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
335c0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
335d0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
335e0 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f     /* ORDER BY o
335f0 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44 49  r GROUP BY or DI
33600 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74 6f  STINCT clause to
33610 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72   check */.  Wher
33620 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20  ePath *pPath,   
33630 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61    /* The WherePa
33640 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  th to check */. 
33650 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
33660 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20         /* Might 
33670 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f 47 52  contain WHERE_GR
33680 4f 55 50 42 59 20 6f 72 20 57 48 45 52 45 5f 44  OUPBY or WHERE_D
33690 49 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20 75  ISTINCTBY */.  u
336a0 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20  16 nLoop,       
336b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
336c0 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61  f entries in pPa
336d0 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20  th->aLoop[] */. 
336e0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
336f0 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68  t,     /* Add th
33700 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  is WhereLoop to 
33710 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68  the end of pPath
33720 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42  ->aLoop[] */.  B
33730 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b  itmask *pRevMask
33740 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73       /* OUT: Mas
33750 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20  k of WhereLoops 
33760 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73  to run in revers
33770 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20  e order */.){.  
33780 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20 20  u8 revSet;      
33790 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
337a0 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f   rev is known */
337b0 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20 20  .  u8 rev;      
337c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
337d0 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72  osite sort order
337e0 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b   */.  u8 revIdx;
337f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
33800 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20  ndex sort order 
33810 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44  */.  u8 isOrderD
33820 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c  istinct;   /* Al
33830 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f  l prior WhereLoo
33840 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73  ps are order-dis
33850 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69  tinct */.  u8 di
33860 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20  stinctColumns;  
33870 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
33880 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20  loop has UNIQUE 
33890 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  NOT NULL columns
338a0 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68   */.  u8 isMatch
338b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  ;           /* i
338c0 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61  Column matches a
338d0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
338e0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
338f0 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20    u16 nKeyCol;  
33900 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
33910 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  r of key columns
33920 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20   in pIndex */.  
33930 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20  u16 nColumn;    
33940 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
33950 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72 65 64  umber of ordered
33960 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
33970 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  index */.  u16 n
33980 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
33990 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73   /* Number terms
339a0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
339b0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
339c0 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
339d0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57     /* Index of W
339e0 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74  hereLoop in pPat
339f0 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  h being processe
33a00 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  d */.  int i, j;
33a10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33a20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
33a30 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
33a40 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
33a50 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75  or number for cu
33a60 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
33a70 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
33a80 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
33a90 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69  column number wi
33aa0 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20  thin table iCur 
33ab0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
33ac0 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75  pLoop = 0; /* Cu
33ad0 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
33ae0 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e  being processed.
33af0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
33b00 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41  *pTerm;     /* A
33b10 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
33b20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
33b30 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45   */.  Expr *pOBE
33b40 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  xpr;        /* A
33b50 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
33b60 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  m the ORDER BY c
33b70 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53  lause */.  CollS
33b80 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
33b90 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63   /* COLLATE func
33ba0 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44  tion from an ORD
33bb0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
33bc0 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  m */.  Index *pI
33bd0 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  ndex;        /* 
33be0 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69  The index associ
33bf0 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20  ated with pLoop 
33c00 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
33c10 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
33c20 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
33c30 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
33c40 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61  /.  Bitmask obSa
33c50 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73  t = 0;    /* Mas
33c60 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  k of ORDER BY te
33c70 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 73 6f  rms satisfied so
33c80 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73   far */.  Bitmas
33c90 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20  k obDone;       
33ca0 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f  /* Mask of all O
33cb0 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f  RDER BY terms */
33cc0 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72  .  Bitmask order
33cd0 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f  DistinctMask;  /
33ce0 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65  * Mask of all we
33cf0 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73  ll-ordered loops
33d00 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65   */.  Bitmask re
33d10 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
33d20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e    /* Mask of inn
33d30 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f  er loops */..  /
33d40 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68  *.  ** We say th
33d50 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22  e WhereLoop is "
33d60 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67  one-row" if it g
33d70 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65  enerates no more
33d80 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72   than one.  ** r
33d90 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41  ow of output.  A
33da0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e   WhereLoop is on
33db0 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20  e-row if all of 
33dc0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
33dd0 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61  e true:.  **  (a
33de0 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  ) All index colu
33df0 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20 57  mns match with W
33e00 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a  HERE_COLUMN_EQ..
33e10 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e    **  (b) The in
33e20 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20  dex is unique.  
33e30 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70  ** Any WhereLoop
33e40 20 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43   with an WHERE_C
33e50 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61  OLUMN_EQ constra
33e60 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64  int on the rowid
33e70 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a   is one-row..  *
33e80 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20  * Every one-row 
33e90 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68  WhereLoop will h
33ea0 61 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e  ave the WHERE_ON
33eb0 45 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20  EROW bit set in 
33ec0 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20  wsFlags..  **.  
33ed0 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68  ** We say the Wh
33ee0 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65  ereLoop is "orde
33ef0 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20 74  r-distinct" if t
33f00 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e  he set of column
33f10 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74  s from.  ** that
33f20 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
33f30 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52  are in the ORDER
33f40 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 64   BY clause are d
33f50 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
33f60 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74  ry.  ** row of t
33f70 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45  he WhereLoop.  E
33f80 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65  very one-row Whe
33f90 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61  reLoop is automa
33fa0 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64  tically.  ** ord
33fb0 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41  er-distinct.   A
33fc0 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
33fd0 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69  has no columns i
33fe0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
33ff0 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  lause.  ** is no
34000 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  t order-distinct
34010 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69  . To be order-di
34020 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75  stinct is not qu
34030 69 74 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  ite the same as 
34040 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55  being.  ** UNIQU
34050 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45  E since a UNIQUE
34060 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78   column or index
34070 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70   can have multip
34080 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20  le rows that .  
34090 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20  ** are NULL and 
340a0 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
340b0 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74  equivalent for t
340c0 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72  he purpose of or
340d0 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20  der-distinct..  
340e0 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64  ** To be order-d
340f0 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c  istinct, the col
34100 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49  umns must be UNI
34110 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c  QUE and NOT NULL
34120 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
34130 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c  rowid for a tabl
34140 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51  e is always UNIQ
34150 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20  UE and NOT NULL 
34160 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a  so whenever the.
34170 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61    ** rowid appea
34180 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  rs in the ORDER 
34190 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63  BY clause, the c
341a0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
341b0 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61  reLoop is.  ** a
341c0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64  utomatically ord
341d0 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a  er-distinct..  *
341e0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  /..  assert( pOr
341f0 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66  derBy!=0 );.  if
34200 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d  ( nLoop && Optim
34210 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
34220 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72  db, SQLITE_Order
34230 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74  ByIdxJoin) ) ret
34240 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72  urn 0;..  nOrder
34250 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
34260 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65  Expr;.  testcase
34270 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d  ( nOrderBy==BMS-
34280 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65  1 );.  if( nOrde
34290 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75  rBy>BMS-1 ) retu
342a0 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74  rn 0;  /* Cannot
342b0 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79   optimize overly
342c0 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59 73   large ORDER BYs
342d0 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73   */.  isOrderDis
342e0 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44  tinct = 1;.  obD
342f0 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f  one = MASKBIT(nO
34300 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64  rderBy)-1;.  ord
34310 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d  erDistinctMask =
34320 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b   0;.  ready = 0;
34330 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
34340 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
34350 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20  && obSat<obDone 
34360 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b  && iLoop<=nLoop;
34370 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69   iLoop++){.    i
34380 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61  f( iLoop>0 ) rea
34390 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73  dy |= pLoop->mas
343a0 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f 70  kSelf;.    pLoop
343b0 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f   = iLoop<nLoop ?
343c0 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c   pPath->aLoop[iL
343d0 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20 20  oop] : pLast;.  
343e0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
343f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
34400 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20  TUALTABLE ){.   
34410 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e     if( pLoop->u.
34420 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20 29  vtab.isOrdered )
34430 20 6f 62 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b   obSat = obDone;
34440 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
34450 20 20 7d 0a 20 20 20 20 69 43 75 72 20 3d 20 70    }.    iCur = p
34460 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
34470 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e  >a[pLoop->iTab].
34480 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a  iCursor;..    /*
34490 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52   Mark off any OR
344a0 44 45 52 20 42 59 20 74 65 72 6d 20 58 20 74 68  DER BY term X th
344b0 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69  at is a column i
344c0 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20  n the table of. 
344d0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
344e0 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68  t loop for which
344f0 20 74 68 65 72 65 20 69 73 20 74 65 72 6d 20 69   there is term i
34500 6e 20 74 68 65 20 57 48 45 52 45 0a 20 20 20 20  n the WHERE.    
34510 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  ** clause of the
34520 20 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20   form X IS NULL 
34530 6f 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65  or X=? that refe
34540 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72  rence only outer
34550 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20  .    ** loops.. 
34560 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
34570 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
34580 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d  ++){.      if( M
34590 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61  ASKBIT(i) & obSa
345a0 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
345b0 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71      pOBExpr = sq
345c0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
345d0 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61  late(pOrderBy->a
345e0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
345f0 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
34600 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
34610 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
34620 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62  f( pOBExpr->iTab
34630 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69  le!=iCur ) conti
34640 6e 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  nue;.      pTerm
34650 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 70 57 49   = findTerm(&pWI
34660 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20  nfo->sWC, iCur, 
34670 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
34680 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
34690 20 20 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c           ~ready,
346a0 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c   WO_EQ|WO_ISNULL
346b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
346c0 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69  pTerm==0 ) conti
346d0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
346e0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
346f0 26 57 4f 5f 45 51 29 21 3d 30 20 26 26 20 70 4f  &WO_EQ)!=0 && pO
34700 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  BExpr->iColumn>=
34710 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
34720 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32  st char *z1, *z2
34730 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
34740 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
34750 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61  lSeq(pWInfo->pPa
34760 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
34770 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
34780 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
34790 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
347a0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
347b0 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  z1 = pColl->zNam
347c0 65 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  e;.        pColl
347d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
347e0 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50  llSeq(pWInfo->pP
347f0 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
34800 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
34810 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
34820 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
34830 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 43  .        z2 = pC
34840 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
34850 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
34860 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 21 3d  trICmp(z1, z2)!=
34870 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
34880 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61      }.      obSa
34890 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
348a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
348b0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
348c0 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
348d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
348e0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
348f0 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20   WHERE_IPK ){.  
34900 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30        pIndex = 0
34910 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f  ;.        nKeyCo
34920 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  l = 0;.        n
34930 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20  Column = 1;.    
34940 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e    }else if( (pIn
34950 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  dex = pLoop->u.b
34960 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20  tree.pIndex)==0 
34970 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72  || pIndex->bUnor
34980 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dered ){.       
34990 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
349a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
349b0 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78  nKeyCol = pIndex
349c0 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20  ->nKeyCol;.     
349d0 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e     nColumn = pIn
349e0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  dex->nColumn;.  
349f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
34a00 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31  olumn==nKeyCol+1
34a10 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
34a20 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b  ndex->pTable) );
34a30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
34a40 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
34a50 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 28 2d  n[nColumn-1]==(-
34a60 31 29 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28  1) || !HasRowid(
34a70 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29  pIndex->pTable))
34a80 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65  ;.        isOrde
34a90 72 44 69 73 74 69 6e 63 74 20 3d 20 49 73 55 6e  rDistinct = IsUn
34aa0 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78  iqueIndex(pIndex
34ab0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
34ac0 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
34ad0 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  h all columns of
34ae0 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64   the index and d
34af0 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65  eal with the one
34b00 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  s.      ** that 
34b10 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69  are not constrai
34b20 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e  ned by == or IN.
34b30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
34b40 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30  rev = revSet = 0
34b50 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63 74  ;.      distinct
34b60 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20  Columns = 0;.   
34b70 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
34b80 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
34b90 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20       u8 bOnce;  
34ba0 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20   /* True to run 
34bb0 74 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61  the ORDER BY sea
34bc0 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20  rch loop */..   
34bd0 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65       /* Skip ove
34be0 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c  r == and IS NULL
34bf0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
34c00 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75    if( j<pLoop->u
34c10 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20  .btree.nEq.     
34c20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 53      && pLoop->nS
34c30 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  kip==0.         
34c40 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e  && ((i = pLoop->
34c50 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72  aLTerm[j]->eOper
34c60 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57  ator) & (WO_EQ|W
34c70 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20  O_ISNULL))!=0.  
34c80 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
34c90 20 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53     if( i & WO_IS
34ca0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
34cb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
34cc0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b  OrderDistinct );
34cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
34ce0 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
34cf0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
34d00 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
34d10 3b 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;  .        }.. 
34d20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68         /* Get th
34d30 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
34d40 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43  in the table (iC
34d50 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20  olumn) and sort 
34d60 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  order.        **
34d70 20 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68   (revIdx) for th
34d80 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e j-th column of
34d90 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
34da0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
34db0 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
34dc0 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
34dd0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
34de0 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[j];.          
34df0 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d  revIdx = pIndex-
34e00 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a  >aSortOrder[j];.
34e10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
34e20 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70  olumn==pIndex->p
34e30 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69  Table->iPKey ) i
34e40 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
34e50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34e60 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
34e70 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  -1;.          re
34e80 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  vIdx = 0;.      
34e90 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
34ea0 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64  An unconstrained
34eb0 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67   column that mig
34ec0 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73  ht be NULL means
34ed0 20 74 68 61 74 20 74 68 69 73 0a 20 20 20 20 20   that this.     
34ee0 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20     ** WhereLoop 
34ef0 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65  is not well-orde
34f00 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  red.        */. 
34f10 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
34f20 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20  erDistinct.     
34f30 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d      && iColumn>=
34f40 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e  0.         && j>
34f50 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  =pLoop->u.btree.
34f60 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  nEq.         && 
34f70 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
34f80 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f  aCol[iColumn].no
34f90 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20  tNull==0.       
34fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
34fb0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
34fc0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
34fd0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68        /* Find th
34fe0 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  e ORDER BY term 
34ff0 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
35000 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c   to the j-th col
35010 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  umn.        ** o
35020 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
35030 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20  mark that ORDER 
35040 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20  BY term off .   
35050 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
35060 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20  bOnce = 1;.     
35070 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a     isMatch = 0;.
35080 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
35090 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64   bOnce && i<nOrd
350a0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
350b0 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
350c0 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
350d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
350e0 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
350f0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
35100 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
35110 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
35120 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
35130 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
35140 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20  E_GROUPBY );.   
35150 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
35160 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
35170 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
35180 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
35190 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57  (wctrlFlags & (W
351a0 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45  HERE_GROUPBY|WHE
351b0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d  RE_DISTINCTBY))=
351c0 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a  =0 ) bOnce = 0;.
351d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
351e0 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
351f0 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
35200 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
35210 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
35220 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
35230 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
35240 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21  OBExpr->iColumn!
35250 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  =iColumn ) conti
35260 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
35270 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  f( iColumn>=0 ){
35280 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
35290 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
352a0 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
352b0 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
352c0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
352d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
352e0 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
352f0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
35300 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
35310 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
35320 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64  oll->zName, pInd
35330 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d  ex->azColl[j])!=
35340 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
35350 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35360 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b      isMatch = 1;
35370 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
35380 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35390 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20      if( isMatch 
353a0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
353b0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d   WHERE_GROUPBY)=
353c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
353d0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
353e0 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63   sort order is c
353f0 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20  ompatible in an 
35400 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
35410 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  .          ** So
35420 72 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65  rt order is irre
35430 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f  levant for a GRO
35440 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f  UP BY clause. */
35450 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
35460 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20  evSet ){.       
35470 20 20 20 20 20 69 66 28 20 28 72 65 76 20 5e 20       if( (rev ^ 
35480 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42  revIdx)!=pOrderB
35490 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
354a0 72 20 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b  r ) isMatch = 0;
354b0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
354c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
354d0 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72  v = revIdx ^ pOr
354e0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
354f0 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20  Order;.         
35500 20 20 20 69 66 28 20 72 65 76 20 29 20 2a 70 52     if( rev ) *pR
35510 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49  evMask |= MASKBI
35520 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  T(iLoop);.      
35530 20 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31        revSet = 1
35540 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
35550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35560 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20  if( isMatch ){. 
35570 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
35580 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
35590 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
355a0 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d  distinctColumns=
355b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
355c0 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
355d0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
355e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53   }.          obS
355f0 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
35600 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
35610 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
35620 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a   match found */.
35630 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
35640 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20  =0 || j<nKeyCol 
35650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
35660 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
35670 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20  Distinct!=0 );. 
35680 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
35690 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
356a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
356b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
356c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
356d0 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20  * end Loop over 
356e0 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  all index column
356f0 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64  s */.      if( d
35700 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29  istinctColumns )
35710 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
35720 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
35730 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct==0 );.      
35740 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
35750 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
35760 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e     } /* end-if n
35770 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20  ot one-row */.. 
35780 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61     /* Mark off a
35790 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42  ny other ORDER B
357a0 59 20 74 65 72 6d 73 20 74 68 61 74 20 72 65 66  Y terms that ref
357b0 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a  erence pLoop */.
357c0 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44      if( isOrderD
357d0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
357e0 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
357f0 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73  sk |= pLoop->mas
35800 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72  kSelf;.      for
35810 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
35820 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
35830 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20  Expr *p;.       
35840 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a   Bitmask mTerm;.
35850 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b          if( MASK
35860 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
35870 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
35880 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d     p = pOrderBy-
35890 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
358a0 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 65 78 70       mTerm = exp
358b0 72 54 61 62 6c 65 55 73 61 67 65 28 26 70 57 49  rTableUsage(&pWI
358c0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29  nfo->sMaskSet,p)
358d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 54  ;.        if( mT
358e0 65 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69 74  erm==0 && !sqlit
358f0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
35900 28 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  (p) ) continue;.
35910 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 54 65          if( (mTe
35920 72 6d 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63  rm&~orderDistinc
35930 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  tMask)==0 ){.   
35940 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20         obSat |= 
35950 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
35960 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35970 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74    }.  } /* End t
35980 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  he loop over all
35990 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d   WhereLoops from
359a0 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e   outer-most down
359b0 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a   to inner-most *
359c0 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f  /.  if( obSat==o
359d0 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 28  bDone ) return (
359e0 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69  i8)nOrderBy;.  i
359f0 66 28 20 21 69 73 4f 72 64 65 72 44 69 73 74 69  f( !isOrderDisti
35a00 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  nct ){.    for(i
35a10 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e 30  =nOrderBy-1; i>0
35a20 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69  ; i--){.      Bi
35a30 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49  tmask m = MASKBI
35a40 54 28 69 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  T(i) - 1;.      
35a50 69 66 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d  if( (obSat&m)==m
35a60 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20   ) return i;.   
35a70 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b   }.    return 0;
35a80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
35a90 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ;.}.../*.** If t
35aa0 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  he WHERE_GROUPBY
35ab0 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20   flag is set in 
35ac0 74 68 65 20 6d 61 73 6b 20 70 61 73 73 65 64 20  the mask passed 
35ad0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
35ae0 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70  egin(),.** the p
35af0 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65 73 20 74  lanner assumes t
35b00 68 61 74 20 74 68 65 20 73 70 65 63 69 66 69 65  hat the specifie
35b10 64 20 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20  d pOrderBy list 
35b20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 47 52  is actually a GR
35b30 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65  OUP.** BY clause
35b40 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72   - and so any or
35b50 64 65 72 20 74 68 61 74 20 67 72 6f 75 70 73 20  der that groups 
35b60 72 6f 77 73 20 61 73 20 72 65 71 75 69 72 65 64  rows as required
35b70 20 73 61 74 69 73 66 69 65 73 20 74 68 65 0a 2a   satisfies the.*
35b80 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a  * request..**.**
35b90 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68   Normally, in th
35ba0 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
35bb0 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  t possible for t
35bc0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 64 65 74  he caller to det
35bd0 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65  ermine.** whethe
35be0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77  r or not the row
35bf0 73 20 61 72 65 20 72 65 61 6c 6c 79 20 62 65 69  s are really bei
35c00 6e 67 20 64 65 6c 69 76 65 72 65 64 20 69 6e 20  ng delivered in 
35c10 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 6f 72  sorted order, or
35c20 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65  .** just in some
35c30 20 6f 74 68 65 72 20 6f 72 64 65 72 20 74 68 61   other order tha
35c40 74 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 72  t provides the r
35c50 65 71 75 69 72 65 64 20 67 72 6f 75 70 69 6e 67  equired grouping
35c60 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66  . However,.** if
35c70 20 74 68 65 20 57 48 45 52 45 5f 53 4f 52 54 42   the WHERE_SORTB
35c80 59 47 52 4f 55 50 20 66 6c 61 67 20 69 73 20 61  YGROUP flag is a
35c90 6c 73 6f 20 70 61 73 73 65 64 20 74 6f 20 73 71  lso passed to sq
35ca0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
35cb0 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  ), then.** this 
35cc0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
35cd0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72 65  called on the re
35ce0 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e 66 6f  turned WhereInfo
35cf0 20 6f 62 6a 65 63 74 2e 20 49 74 20 72 65 74 75   object. It retu
35d00 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74  rns.** true if t
35d10 68 65 20 72 6f 77 73 20 72 65 61 6c 6c 79 20 77  he rows really w
35d20 69 6c 6c 20 62 65 20 73 6f 72 74 65 64 20 69 6e  ill be sorted in
35d30 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f   the specified o
35d40 72 64 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a  rder, or false.*
35d50 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  * otherwise..**.
35d60 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
35d70 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  assuming:.**.** 
35d80 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
35d90 31 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a  1 ON t1(x, Y);.*
35da0 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20  *.** then.**.** 
35db0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
35dc0 74 31 20 47 52 4f 55 50 20 42 59 20 78 2c 79 20  t1 GROUP BY x,y 
35dd0 4f 52 44 45 52 20 42 59 20 78 2c 79 3b 20 20 20  ORDER BY x,y;   
35de0 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 31  -- IsSorted()==1
35df0 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
35e00 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20  ROM t1 GROUP BY 
35e10 79 2c 78 20 4f 52 44 45 52 20 42 59 20 79 2c 78  y,x ORDER BY y,x
35e20 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28  ;   -- IsSorted(
35e30 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  )==0.*/.int sqli
35e40 74 65 33 57 68 65 72 65 49 73 53 6f 72 74 65 64  te3WhereIsSorted
35e50 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
35e60 66 6f 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  fo){.  assert( p
35e70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
35e80 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42  s & WHERE_GROUPB
35e90 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Y );.  assert( p
35ea0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
35eb0 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59  s & WHERE_SORTBY
35ec0 47 52 4f 55 50 20 29 3b 0a 20 20 72 65 74 75 72  GROUP );.  retur
35ed0 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64  n pWInfo->sorted
35ee0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52  ;.}..#ifdef WHER
35ef0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
35f00 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20  * For debugging 
35f10 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61  use only: */.sta
35f20 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
35f30 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68  wherePathName(Wh
35f40 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20  erePath *pPath, 
35f50 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65  int nLoop, Where
35f60 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20  Loop *pLast){.  
35f70 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d  static char zNam
35f80 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a  e[65];.  int i;.
35f90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f    for(i=0; i<nLo
35fa0 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b  op; i++){ zName[
35fb0 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  i] = pPath->aLoo
35fc0 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69  p[i]->cId; }.  i
35fd0 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65  f( pLast ) zName
35fe0 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63  [i++] = pLast->c
35ff0 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d  Id;.  zName[i] =
36000 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61   0;.  return zNa
36010 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me;.}.#endif../*
36020 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
36030 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e  ost of sorting n
36040 52 6f 77 20 72 6f 77 73 2c 20 61 73 73 75 6d 69  Row rows, assumi
36050 6e 67 20 74 68 61 74 20 74 68 65 20 6b 65 79 73  ng that the keys
36060 20 68 61 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72   have .** nOrder
36070 62 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74  by columns and t
36080 68 61 74 20 74 68 65 20 66 69 72 73 74 20 6e 53  hat the first nS
36090 6f 72 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  orted columns ar
360a0 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20  e already in.** 
360b0 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
360c0 20 4c 6f 67 45 73 74 20 77 68 65 72 65 53 6f 72   LogEst whereSor
360d0 74 69 6e 67 43 6f 73 74 28 0a 20 20 57 68 65 72  tingCost(.  Wher
360e0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20  eInfo *pWInfo,. 
360f0 20 4c 6f 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20   LogEst nRow,.  
36100 69 6e 74 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20  int nOrderBy,.  
36110 69 6e 74 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20  int nSorted.){. 
36120 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69   /* TUNING: Esti
36130 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20  mated cost of a 
36140 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f  full external so
36150 72 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20 0a  rt, where N is .
36160 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
36170 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f 72 74 20  of rows to sort 
36180 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
36190 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20  cost = (3.0 * N 
361a0 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20  * log(N))..  ** 
361b0 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  .  ** Or, if the
361c0 20 6f 72 64 65 72 2d 62 79 20 63 6c 61 75 73 65   order-by clause
361d0 20 68 61 73 20 58 20 74 65 72 6d 73 20 62 75 74   has X terms but
361e0 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74 20 59   only the last Y
361f0 20 0a 20 20 2a 2a 20 74 65 72 6d 73 20 61 72 65   .  ** terms are
36200 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c 20 74   out of order, t
36210 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e  hen block-sortin
36220 67 20 77 69 6c 6c 20 72 65 64 75 63 65 20 74 68  g will reduce th
36230 65 20 0a 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20  e .  ** sorting 
36240 63 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  cost to:.  **.  
36250 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30  **   cost = (3.0
36260 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a   * N * log(N)) *
36270 20 28 59 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a   (Y/X).  **.  **
36280 20 54 68 65 20 28 59 2f 58 29 20 74 65 72 6d 20   The (Y/X) term 
36290 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
362a0 73 69 6e 67 20 73 74 61 63 6b 20 76 61 72 69 61  sing stack varia
362b0 62 6c 65 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20  ble rScale.  ** 
362c0 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67  below.  */.  Log
362d0 45 73 74 20 72 53 63 61 6c 65 2c 20 72 53 6f 72  Est rScale, rSor
362e0 74 43 6f 73 74 3b 0a 20 20 61 73 73 65 72 74 28  tCost;.  assert(
362f0 20 6e 4f 72 64 65 72 42 79 3e 30 20 26 26 20 36   nOrderBy>0 && 6
36300 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
36310 28 31 30 30 29 20 29 3b 0a 20 20 72 53 63 61 6c  (100) );.  rScal
36320 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  e = sqlite3LogEs
36330 74 28 28 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72  t((nOrderBy-nSor
36340 74 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42  ted)*100/nOrderB
36350 79 29 20 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74  y) - 66;.  rSort
36360 43 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20 65 73  Cost = nRow + es
36370 74 4c 6f 67 28 6e 52 6f 77 29 20 2b 20 72 53 63  tLog(nRow) + rSc
36380 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20  ale + 16;..  /* 
36390 54 55 4e 49 4e 47 3a 20 54 68 65 20 63 6f 73 74  TUNING: The cost
363a0 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
363b0 20 44 49 53 54 49 4e 43 54 20 75 73 69 6e 67 20   DISTINCT using 
363c0 61 20 42 2d 54 52 45 45 20 69 73 0a 20 20 2a 2a  a B-TREE is.  **
363d0 20 73 69 6d 69 6c 61 72 20 62 75 74 20 77 69 74   similar but wit
363e0 68 20 61 20 6c 61 72 67 65 72 20 63 6f 6e 73 74  h a larger const
363f0 61 6e 74 20 6f 66 20 70 72 6f 70 6f 72 74 69 6f  ant of proportio
36400 6e 61 6c 69 74 79 2e 20 0a 20 20 2a 2a 20 4d 75  nality. .  ** Mu
36410 6c 74 69 70 6c 79 20 62 79 20 61 6e 20 61 64 64  ltiply by an add
36420 69 74 69 6f 6e 61 6c 20 66 61 63 74 6f 72 20 6f  itional factor o
36430 66 20 33 2e 30 2e 20 20 2a 2f 0a 20 20 69 66 28  f 3.0.  */.  if(
36440 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
36450 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
36460 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20  _DISTINCT ){.   
36470 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20 31 36   rSortCost += 16
36480 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
36490 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a  rSortCost;.}../*
364a0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69  .** Given the li
364b0 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  st of WhereLoop 
364c0 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66  objects at pWInf
364d0 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20  o->pLoops, this 
364e0 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d  routine.** attem
364f0 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20  pts to find the 
36500 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
36510 20 74 68 61 74 20 76 69 73 69 74 73 20 65 61 63   that visits eac
36520 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f  h WhereLoop.** o
36530 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74 68 20  nce.  This path 
36540 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69  is then loaded i
36550 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e  nto the pWInfo->
36560 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64  a[].pWLoop field
36570 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20  s..**.** Assume 
36580 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e  that the total n
36590 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
365a0 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  rows that will n
365b0 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64  eed to be sorted
365c0 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77  .** will be nRow
365d0 45 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c  Est (in the 10*l
365e0 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61 74 69  og2 representati
365f0 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65  on).  Or, ignore
36600 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74   sorting.** cost
36610 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e  s if nRowEst==0.
36620 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
36630 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
36640 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ss or SQLITE_NOM
36650 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61  EM of a memory a
36660 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72  llocation.** err
36670 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
36680 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61  atic int wherePa
36690 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e  thSolver(WhereIn
366a0 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45  fo *pWInfo, LogE
366b0 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69  st nRowEst){.  i
366c0 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20  nt mxChoice;    
366d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
366e0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  mum number of si
366f0 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73  multaneous paths
36700 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e   tracked */.  in
36710 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t nLoop;        
36720 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
36730 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
36740 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73  e join */.  Pars
36750 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
36760 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
36770 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
36780 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
36790 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
367a0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
367b0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  on */.  int iLoo
367c0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
367d0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
367e0 72 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73  r over the terms
367f0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
36800 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20    int ii, jj;   
36810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
36820 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
36830 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20    int mxI = 0;  
36840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
36850 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74  ndex of next ent
36860 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f  ry to replace */
36870 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
36880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36890 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20  Number of ORDER 
368a0 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  BY clause terms 
368b0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f  */.  LogEst mxCo
368c0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  st = 0;        /
368d0 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f  * Maximum cost o
368e0 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73  f a set of paths
368f0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55   */.  LogEst mxU
36900 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20 20 20 20  nsorted = 0;    
36910 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72  /* Maximum unsor
36920 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 73 65  ted cost of a se
36930 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20 69  t of path */.  i
36940 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20  nt nTo, nFrom;  
36950 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
36960 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72  er of valid entr
36970 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64  ies in aTo[] and
36980 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68   aFrom[] */.  Wh
36990 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20  erePath *aFrom; 
369a0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e          /* All n
369b0 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68  From paths at th
369c0 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c  e previous level
369d0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
369e0 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *aTo;           
369f0 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20  /* The nTo best 
36a00 70 61 74 68 73 20 61 74 20 74 68 65 20 63 75 72  paths at the cur
36a10 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rent level */.  
36a20 57 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d  WherePath *pFrom
36a30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ;         /* An 
36a40 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d  element of aFrom
36a50 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
36a60 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
36a70 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20  herePath *pTo;  
36a80 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
36a90 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20  lement of aTo[] 
36aa0 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b  that we are work
36ab0 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ing on */.  Wher
36ac0 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20  eLoop *pWLoop;  
36ad0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
36ae0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
36af0 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65  jects */.  Where
36b00 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20  Loop **pX;      
36b10 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
36b20 64 69 76 79 20 75 70 20 74 68 65 20 70 53 70 61  divy up the pSpa
36b30 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c  ce memory */.  L
36b40 6f 67 45 73 74 20 2a 61 53 6f 72 74 43 6f 73 74  ogEst *aSortCost
36b50 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74   = 0;    /* Sort
36b60 69 6e 67 20 61 6e 64 20 70 61 72 74 69 61 6c 20  ing and partial 
36b70 73 6f 72 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f  sorting costs */
36b80 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b  .  char *pSpace;
36b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36ba0 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  Temporary memory
36bb0 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f   used by this ro
36bc0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  utine */.  int n
36bd0 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
36be0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
36bf0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
36c00 20 61 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20   at pSpace */.. 
36c10 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
36c20 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d  ->pParse;.  db =
36c30 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e   pParse->db;.  n
36c40 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  Loop = pWInfo->n
36c50 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49  Level;.  /* TUNI
36c60 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71  NG: For simple q
36c70 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65  ueries, only the
36c80 20 62 65 73 74 20 70 61 74 68 20 69 73 20 74 72   best path is tr
36c90 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  acked..  ** For 
36ca0 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65  2-way joins, the
36cb0 20 35 20 62 65 73 74 20 70 61 74 68 73 20 61 72   5 best paths ar
36cc0 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a  e followed..  **
36cd0 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20   For joins of 3 
36ce0 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20  or more tables, 
36cf0 74 72 61 63 6b 20 74 68 65 20 31 30 20 62 65 73  track the 10 bes
36d00 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43  t paths */.  mxC
36d10 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d  hoice = (nLoop<=
36d20 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d  1) ? 1 : (nLoop=
36d30 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20  =2 ? 5 : 10);.  
36d40 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70  assert( nLoop<=p
36d50 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
36d60 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45  >nSrc );.  WHERE
36d70 54 52 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d  TRACE(0x002, ("-
36d80 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72  --- begin solver
36d90 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c  .  (nRowEst=%d)\
36da0 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a  n", nRowEst));..
36db0 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74 20    /* If nRowEst 
36dc0 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 72  is zero and ther
36dd0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
36de0 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65 20   clause, ignore 
36df0 69 74 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a  it. In this.  **
36e00 20 63 61 73 65 20 74 68 65 20 70 75 72 70 6f 73   case the purpos
36e10 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69  e of this call i
36e20 73 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  s to estimate th
36e30 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
36e40 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62   returned.  ** b
36e50 79 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 71 75  y the overall qu
36e60 65 72 79 2e 20 4f 6e 63 65 20 74 68 69 73 20 65  ery. Once this e
36e70 73 74 69 6d 61 74 65 20 68 61 73 20 62 65 65 6e  stimate has been
36e80 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 20 63   obtained, the c
36e90 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20  aller.  ** will 
36ea0 69 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63  invoke this func
36eb0 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74 69  tion a second ti
36ec0 6d 65 2c 20 70 61 73 73 69 6e 67 20 74 68 65 20  me, passing the 
36ed0 65 73 74 69 6d 61 74 65 20 61 73 20 74 68 65 0a  estimate as the.
36ee0 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61 72    ** nRowEst par
36ef0 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66  ameter.  */.  if
36f00 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
36f10 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74  By==0 || nRowEst
36f20 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65  ==0 ){.    nOrde
36f30 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rBy = 0;.  }else
36f40 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d  {.    nOrderBy =
36f50 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
36f60 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20  y->nExpr;.  }.. 
36f70 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
36f80 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63   initialize spac
36f90 65 20 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d  e for aTo, aFrom
36fa0 20 61 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d   and aSortCost[]
36fb0 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20 28   */.  nSpace = (
36fc0 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68  sizeof(WherePath
36fd0 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  )+sizeof(WhereLo
36fe0 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68  op*)*nLoop)*mxCh
36ff0 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65  oice*2;.  nSpace
37000 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73   += sizeof(LogEs
37010 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20  t) * nOrderBy;. 
37020 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65   pSpace = sqlite
37030 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
37040 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20   nSpace);.  if( 
37050 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
37060 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
37070 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50  .  aTo = (WhereP
37080 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61  ath*)pSpace;.  a
37090 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f  From = aTo+mxCho
370a0 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46  ice;.  memset(aF
370b0 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  rom, 0, sizeof(a
370c0 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20  From[0]));.  pX 
370d0 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28  = (WhereLoop**)(
370e0 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b  aFrom+mxChoice);
370f0 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69  .  for(ii=mxChoi
37100 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b  ce*2, pFrom=aTo;
37110 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72   ii>0; ii--, pFr
37120 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f  om++, pX += nLoo
37130 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61  p){.    pFrom->a
37140 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20  Loop = pX;.  }. 
37150 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b   if( nOrderBy ){
37160 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
37170 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
37180 63 6c 61 75 73 65 20 61 6e 64 20 69 74 20 69 73  clause and it is
37190 20 6e 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f 72   not being ignor
371a0 65 64 2c 20 73 65 74 20 75 70 0a 20 20 20 20 2a  ed, set up.    *
371b0 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
371c0 61 53 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72 61  aSortCost[] arra
371d0 79 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20  y. Each element 
371e0 6f 66 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74  of the aSortCost
371f0 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 69 73   array.    ** is
37200 20 65 69 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d   either zero - m
37210 65 61 6e 69 6e 67 20 69 74 20 68 61 73 20 6e 6f  eaning it has no
37220 74 20 79 65 74 20 62 65 65 6e 20 69 6e 69 74 69  t yet been initi
37230 61 6c 69 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a  alized - or the.
37240 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73      ** cost of s
37250 6f 72 74 69 6e 67 20 6e 52 6f 77 45 73 74 20 72  orting nRowEst r
37260 6f 77 73 20 6f 66 20 64 61 74 61 20 77 68 65 72  ows of data wher
37270 65 20 74 68 65 20 66 69 72 73 74 20 58 20 74 65  e the first X te
37280 72 6d 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  rms of.    ** th
37290 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
372a0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
372b0 20 6f 72 64 65 72 2c 20 77 68 65 72 65 20 58 20   order, where X 
372c0 69 73 20 74 68 65 20 61 72 72 61 79 20 0a 20 20  is the array .  
372d0 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a    ** index.  */.
372e0 20 20 20 20 61 53 6f 72 74 43 6f 73 74 20 3d 20      aSortCost = 
372f0 28 4c 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20 20  (LogEst*)pX;.   
37300 20 6d 65 6d 73 65 74 28 61 53 6f 72 74 43 6f 73   memset(aSortCos
37310 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67  t, 0, sizeof(Log
37320 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 29  Est) * nOrderBy)
37330 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
37340 61 53 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20  aSortCost==0 || 
37350 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d  &pSpace[nSpace]=
37360 3d 28 63 68 61 72 2a 29 26 61 53 6f 72 74 43 6f  =(char*)&aSortCo
37370 73 74 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a  st[nOrderBy] );.
37380 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43    assert( aSortC
37390 6f 73 74 21 3d 30 20 7c 7c 20 26 70 53 70 61 63  ost!=0 || &pSpac
373a0 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72  e[nSpace]==(char
373b0 2a 29 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  *)pX );..  /* Se
373c0 65 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69  ed the search wi
373d0 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72  th a single Wher
373e0 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67  ePath containing
373f0 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73   zero WhereLoops
37400 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49  ..  **.  ** TUNI
37410 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74  NG: Do not let t
37420 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65  he number of ite
37430 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65  rations go above
37440 20 32 38 2e 20 20 49 66 20 74 68 65 20 63 6f 73   28.  If the cos
37450 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74  t.  ** of comput
37460 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
37470 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61   index is not pa
37480 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74  id back within t
37490 68 65 20 66 69 72 73 74 20 32 38 0a 20 20 2a 2a  he first 28.  **
374a0 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e   rows, then do n
374b0 6f 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d  ot use the autom
374c0 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  atic index. */. 
374d0 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d   aFrom[0].nRow =
374e0 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75   MIN(pParse->nQu
374f0 65 72 79 4c 6f 6f 70 2c 20 34 38 29 3b 20 20 61  eryLoop, 48);  a
37500 73 73 65 72 74 28 20 34 38 3d 3d 73 71 6c 69 74  ssert( 48==sqlit
37510 65 33 4c 6f 67 45 73 74 28 32 38 29 20 29 3b 0a  e3LogEst(28) );.
37520 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61    nFrom = 1;.  a
37530 73 73 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e  ssert( aFrom[0].
37540 69 73 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a  isOrdered==0 );.
37550 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29    if( nOrderBy )
37560 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f  {.    /* If nLoo
37570 70 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p is zero, then 
37580 74 68 65 72 65 20 61 72 65 20 6e 6f 20 46 52 4f  there are no FRO
37590 4d 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 71  M terms in the q
375a0 75 65 72 79 2e 20 53 69 6e 63 65 0a 20 20 20 20  uery. Since.    
375b0 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  ** in this case 
375c0 74 68 65 20 71 75 65 72 79 20 6d 61 79 20 72 65  the query may re
375d0 74 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f  turn a maximum o
375e0 66 20 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20 72  f one row, the r
375f0 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72  esults.    ** ar
37600 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  e already in the
37610 20 72 65 71 75 65 73 74 65 64 20 6f 72 64 65 72   requested order
37620 2e 20 53 65 74 20 69 73 4f 72 64 65 72 65 64 20  . Set isOrdered 
37630 74 6f 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20  to nOrderBy to. 
37640 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74     ** indicate t
37650 68 69 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f  his. Or, if nLoo
37660 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  p is greater tha
37670 6e 20 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f 72  n zero, set isOr
37680 64 65 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  dered to.    ** 
37690 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  -1, indicating t
376a0 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  hat the result s
376b0 65 74 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  et may or may no
376c0 74 20 62 65 20 6f 72 64 65 72 65 64 2c 20 0a 20  t be ordered, . 
376d0 20 20 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20     ** depending 
376e0 6f 6e 20 74 68 65 20 6c 6f 6f 70 73 20 61 64 64  on the loops add
376f0 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ed to the curren
37700 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20  t plan.  */.    
37710 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
37720 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d  ed = nLoop>0 ? -
37730 31 20 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  1 : nOrderBy;.  
37740 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
37750 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e  successively lon
37760 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75  ger WherePaths u
37770 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75  sing the previou
37780 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a  s generation.  *
37790 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20  * of WherePaths 
377a0 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72  as the basis for
377b0 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70   the next.  Keep
377c0 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78   track of the mx
377d0 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74  Choice.  ** best
377e0 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67   paths at each g
377f0 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66  eneration */.  f
37800 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
37810 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
37820 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a  ){.    nTo = 0;.
37830 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46      for(ii=0, pF
37840 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46  rom=aFrom; ii<nF
37850 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d  rom; ii++, pFrom
37860 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  ++){.      for(p
37870 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c  WLoop=pWInfo->pL
37880 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57  oops; pWLoop; pW
37890 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65  Loop=pWLoop->pNe
378a0 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20  xtLoop){.       
378b0 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20   LogEst nOut;   
378c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378d0 20 20 20 2f 2a 20 52 6f 77 73 20 76 69 73 69 74     /* Rows visit
378e0 65 64 20 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c  ed by (pFrom+pWL
378f0 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oop) */.        
37900 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20  LogEst rCost;   
37910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37920 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61 74    /* Cost of pat
37930 68 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  h (pFrom+pWLoop)
37940 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45   */.        LogE
37950 73 74 20 72 55 6e 73 6f 72 74 65 64 3b 20 20 20  st rUnsorted;   
37960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37970 20 55 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f   Unsorted cost o
37980 66 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  f (pFrom+pWLoop)
37990 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 38 20 69   */.        i8 i
379a0 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d  sOrdered = pFrom
379b0 2d 3e 69 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a  ->isOrdered;  /*
379c0 20 69 73 4f 72 64 65 72 65 64 20 66 6f 72 20 28   isOrdered for (
379d0 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f  pFrom+pWLoop) */
379e0 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
379f0 20 6d 61 73 6b 4e 65 77 3b 20 20 20 20 20 20 20   maskNew;       
37a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
37a10 73 6b 20 6f 66 20 73 72 63 20 76 69 73 69 74 65  sk of src visite
37a20 64 20 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20  d by (..) */.   
37a30 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76       Bitmask rev
37a40 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  Mask = 0;       
37a50 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
37a60 66 20 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70  f rev-order loop
37a70 73 20 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20  s for (..) */.. 
37a80 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
37a90 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46  op->prereq & ~pF
37aa0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
37ab0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
37ac0 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
37ad0 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46  p->maskSelf & pF
37ae0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
37af0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
37b00 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
37b10 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69   point, pWLoop i
37b20 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  s a candidate to
37b30 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f   be the next loo
37b40 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43  p. .        ** C
37b50 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74 20  ompute its cost 
37b60 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f  */.        rUnso
37b70 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rted = sqlite3Lo
37b80 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e  gEstAdd(pWLoop->
37b90 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72  rSetup,pWLoop->r
37ba0 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Run + pFrom->nRo
37bb0 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55 6e 73  w);.        rUns
37bc0 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c  orted = sqlite3L
37bd0 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74  ogEstAdd(rUnsort
37be0 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f  ed, pFrom->rUnso
37bf0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 6e  rted);.        n
37c00 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Out = pFrom->nRo
37c10 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74  w + pWLoop->nOut
37c20 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65  ;.        maskNe
37c30 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  w = pFrom->maskL
37c40 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61  oop | pWLoop->ma
37c50 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20  skSelf;.        
37c60 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20  if( isOrdered<0 
37c70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f  ){.          isO
37c80 72 64 65 72 65 64 20 3d 20 77 68 65 72 65 50 61  rdered = wherePa
37c90 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
37ca0 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20  By(pWInfo,.     
37cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37cc0 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
37cd0 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66  By, pFrom, pWInf
37ce0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20  o->wctrlFlags,. 
37cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d00 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c        iLoop, pWL
37d10 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a  oop, &revMask);.
37d20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
37d30 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b           revMask
37d40 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
37d50 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
37d60 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
37d70 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72  ed>=0 && isOrder
37d80 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  ed<nOrderBy ){. 
37d90 20 20 20 20 20 20 20 20 20 69 66 28 20 61 53 6f           if( aSo
37da0 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
37db0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
37dc0 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73      aSortCost[is
37dd0 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65 72 65  Ordered] = where
37de0 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 20  SortingCost(.   
37df0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
37e00 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f  nfo, nRowEst, nO
37e10 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65 72 65  rderBy, isOrdere
37e20 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  d.            );
37e30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
37e40 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73         rCost = s
37e50 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
37e60 72 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72 74  rUnsorted, aSort
37e70 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 29  Cost[isOrdered])
37e80 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 57 48 45  ;..          WHE
37e90 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 0a 20  RETRACE(0x002,. 
37ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 22 2d               ("-
37eb0 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d  --- sort cost=%-
37ec0 33 64 20 28 25 64 2f 25 64 29 20 69 6e 63 72 65  3d (%d/%d) incre
37ed0 61 73 65 73 20 63 6f 73 74 20 25 33 64 20 74 6f  ases cost %3d to
37ee0 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20   %-3d\n",.      
37ef0 20 20 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f           aSortCo
37f00 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20 28  st[isOrdered], (
37f10 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64 65 72  nOrderBy-isOrder
37f20 65 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a  ed), nOrderBy, .
37f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
37f40 55 6e 73 6f 72 74 65 64 2c 20 72 43 6f 73 74 29  Unsorted, rCost)
37f50 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
37f60 7b 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f 73  {.          rCos
37f70 74 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20  t = rUnsorted;. 
37f80 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
37f90 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
37fa0 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75  e if pWLoop shou
37fb0 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ld be added to t
37fc0 68 65 20 73 65 74 20 6f 66 0a 20 20 20 20 20 20  he set of.      
37fd0 20 20 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62 65    ** mxChoice be
37fe0 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e  st-so-far paths.
37ff0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
38000 20 20 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f      ** First loo
38010 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  k for an existin
38020 67 20 70 61 74 68 20 61 6d 6f 6e 67 20 62 65 73  g path among bes
38030 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 0a 20  t-so-far paths. 
38040 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
38050 6f 76 65 72 73 20 74 68 65 20 73 61 6d 65 20 73  overs the same s
38060 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20  et of loops and 
38070 68 61 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f  has the same isO
38080 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a  rdered.        *
38090 2a 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65  * setting as the
380a0 20 63 75 72 72 65 6e 74 20 70 61 74 68 20 63 61   current path ca
380b0 6e 64 69 64 61 74 65 2e 0a 20 20 20 20 20 20 20  ndidate..       
380c0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
380d0 68 65 20 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e  he term "((pTo->
380e0 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65  isOrdered^isOrde
380f0 72 65 64 29 26 30 78 38 30 29 3d 3d 30 22 20 69  red)&0x80)==0" i
38100 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20  s equivalent.   
38110 20 20 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d       ** to (pTo-
38120 3e 69 73 4f 72 64 65 72 65 64 3