/ Hex Artifact Content
Login

Artifact c9613a13a066a650675e66515d28fd4ecab5ab17:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nOBSat;.}../*.*
05a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
05b0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
05c0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
05d0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
05e0: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
05f0: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
0600: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
0610: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
0620: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
0630: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
0640: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
0650: 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43  sert( pWInfo->iC
0660: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
0670: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0680: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
0690: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44  ** Return the VD
06a0: 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61  BE address or la
06b0: 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  bel to jump to i
06c0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b  n order to break
06d0: 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45  .** out of a WHE
06e0: 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  RE loop..*/.int 
06f0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
0700: 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  kLabel(WhereInfo
0710: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0720: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  urn pWInfo->iBre
0730: 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ak;.}../*.** Ret
0740: 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55  urn TRUE if an U
0750: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0760: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70  statement can op
0770: 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f  erate directly o
0780: 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20  n.** the rowids 
0790: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57 48  returned by a WH
07a0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74  ERE clause.  Ret
07b0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69  urn FALSE if doi
07c0: 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20  ng an.** UPDATE 
07d0: 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20  or DELETE might 
07e0: 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e  change subsequen
07f0: 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72  t WHERE clause r
0800: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  esults..**.** If
0810: 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
0820: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
0830: 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74 69  d (if this routi
0840: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 29  ne returns true)
0850: 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  .** then also wr
0860: 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73 20  ite the indices 
0870: 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20  of open cursors 
0880: 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a  used by ONEPASS.
0890: 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d  ** into aiCur[0]
08a0: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20   and aiCur[1].  
08b0: 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68  iaCur[0] gets th
08c0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
08d0: 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e  data.** table an
08e0: 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20  d iaCur[1] gets 
08f0: 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  the cursor used 
0900: 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  by an auxiliary 
0910: 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72  index..** Either
0920: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31   value may be -1
0930: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
0940: 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  t cursor is not 
0950: 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72  used..** Any cur
0960: 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77 69  sors returned wi
0970: 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ll have been ope
0980: 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ned for writing.
0990: 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20  .**.** aiCur[0] 
09a0: 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74  and aiCur[1] bot
09b0: 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65 20  h get -1 if the 
09c0: 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67  where-clause log
09d0: 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20  ic is.** unable 
09e0: 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41  to use the ONEPA
09f0: 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  SS optimization.
0a00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
0a10: 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68  hereOkOnePass(Wh
0a20: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
0a30: 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20   int *aiCur){.  
0a40: 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57  memcpy(aiCur, pW
0a50: 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
0a60: 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  ss, sizeof(int)*
0a70: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  2);.  return pWI
0a80: 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a  nfo->okOnePass;.
0a90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0aa0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0ab0: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0ad0: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0ae0: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0af0: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0b00: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0b10: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0b20: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0b30: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0b40: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0b50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0b60: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0b70: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0b80: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0b90: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0ba0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0bb0: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0bc0: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0bd0: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0be0: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0bf0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0c00: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0c10: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0c20: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0c30: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0c40: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0c50: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0c60: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0c70: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0c80: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0c90: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0ca0: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0cb0: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0cc0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0cd0: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0ce0: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0cf0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0d00: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0d20: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0d30: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0d40: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0d50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0d60: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0d70: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0d80: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
0d90: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
0da0: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
0db0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
0dc0: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
0dd0: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
0de0: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
0df0: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
0e00: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
0e10: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
0e20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
0e30: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
0e40: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
0e50: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
0e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0e70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0e80: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
0e90: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
0ea0: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
0eb0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
0ec0: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
0ed0: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
0ee0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
0ef0: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
0f00: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
0f10: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
0f20: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
0f30: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
0f40: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
0f50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
0f60: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f70: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
0f80: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
0f90: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
0fa0: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
0fb0: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
0fc0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
0fd0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
0fe0: 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57  a preallocated W
0ff0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
1000: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
1010: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
1020: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61  Init(.  WhereCla
1030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
1040: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61   /* The WhereCla
1050: 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  use to be initia
1060: 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lized */.  Where
1070: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20  Info *pWInfo    
1080: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1090: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
10a0: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d  ext */.){.  pWC-
10b0: 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  >pWInfo = pWInfo
10c0: 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20  ;.  pWC->pOuter 
10d0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  = 0;.  pWC->nTer
10e0: 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53  m = 0;.  pWC->nS
10f0: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
1100: 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20  pWC->aStatic);. 
1110: 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61   pWC->a = pWC->a
1120: 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Static;.}../* Fo
1130: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
1140: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1150: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
1160: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
1170: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
1180: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
1190: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
11a0: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
11b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11c0: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
11d0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
11e0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
11f0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
1200: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
1210: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1220: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
1230: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
1240: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
1250: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
1260: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
1270: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
1280: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
1290: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
12a0: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
12b0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
12c0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
12d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
12e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
12f0: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
1300: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
1310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
1330: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
1340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1350: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
1360: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1370: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1380: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1390: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
13a0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
13b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
13c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13d0: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
13e0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
13f0: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
1400: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
1410: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
1420: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
1430: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
1440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1450: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
1460: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
1470: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
1480: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
1490: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
14a0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
14b0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
14c0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
14d0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
14e0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
14f0: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
1500: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
1510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1520: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
1530: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
1540: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1550: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
1560: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
1570: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
1580: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
1590: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
15a0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
15b0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
15c0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
15d0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
15e0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
15f0: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
1600: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
1610: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
1620: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1630: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
1640: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
1650: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
1660: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
1670: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
1680: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1690: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
16a0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
16b0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
16c0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
16d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
16e0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
16f0: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
1700: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
1710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1720: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
1730: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1740: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
1750: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
1760: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
1770: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
1780: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
1790: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
17a0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
17b0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
17c0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
17d0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
17e0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
17f0: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
1800: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
1810: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
1820: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
1830: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1840: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
1850: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
1860: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
1870: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
1880: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
1890: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
18a0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
18b0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
18c0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
18d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
18e0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
18f0: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
1900: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
1910: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
1920: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
1930: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
1940: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
1950: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
1960: 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29   *p, u8 wtFlags)
1970: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
1980: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
1990: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46  .  testcase( wtF
19a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
19b0: 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57 43  UAL );.  if( pWC
19c0: 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53  ->nTerm>=pWC->nS
19d0: 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65  lot ){.    Where
19e0: 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43  Term *pOld = pWC
19f0: 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ->a;.    sqlite3
1a00: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e   *db = pWC->pWIn
1a10: 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
1a20: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c      pWC->a = sql
1a30: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1a40: 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e  db, sizeof(pWC->
1a50: 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74  a[0])*pWC->nSlot
1a60: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57  *2 );.    if( pW
1a70: 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  C->a==0 ){.     
1a80: 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54   if( wtFlags & T
1a90: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
1aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ab0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  prDelete(db, p);
1ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ad0: 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20  WC->a = pOld;.  
1ae0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1af0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1b00: 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a  WC->a, pOld, siz
1b10: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
1b20: 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  WC->nTerm);.    
1b30: 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61  if( pOld!=pWC->a
1b40: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
1b50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1b60: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  , pOld);.    }. 
1b70: 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20     pWC->nSlot = 
1b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1b90: 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f  ize(db, pWC->a)/
1ba0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
1bb0: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
1bc0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
1bd0: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
1be0: 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61 73  if( p && ExprHas
1bf0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 55  Property(p, EP_U
1c00: 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20  nlikely) ){.    
1c10: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c20: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1c30: 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 39 39  (p->iTable) - 99
1c40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1c50: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 20  Term->truthProb 
1c60: 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  = 1;.  }.  pTerm
1c70: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
1c80: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1c90: 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  (p);.  pTerm->wt
1ca0: 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b  Flags = wtFlags;
1cb0: 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20  .  pTerm->pWC = 
1cc0: 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50  pWC;.  pTerm->iP
1cd0: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65  arent = -1;.  re
1ce0: 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a  turn idx;.}../*.
1cf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d00: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
1d10: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
1d20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
1d30: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
1d40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
1d50: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e  arated by the AN
1d60: 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f  D operator or so
1d70: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72  me other.** oper
1d80: 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  ator specified i
1d90: 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  n the op paramet
1da0: 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  er.  The WhereCl
1db0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
1dc0: 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  * is filled with
1dd0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62   pointers to sub
1de0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
1df0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
1e00: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
1e10: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
1e20: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
1e30: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
1e40: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
1e50: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
1e60: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
1e70: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
1e80: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
1e90: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
1ea0: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ec0: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
1ed0: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
1ee0: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
1ef0: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
1f00: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
1f10: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
1f20: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
1f30: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
1f40: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
1f50: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
1f60: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
1f70: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
1f80: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
1f90: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
1fa0: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
1fb0: 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74  array.  The slot
1fc0: 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61  [] array grows a
1fd0: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74  s needed to cont
1fe0: 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73  ain.** all terms
1ff0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2000: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
2010: 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28  void whereSplit(
2020: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2030: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75  , Expr *pExpr, u
2040: 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70  8 op){.  pWC->op
2050: 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 78   = op;.  if( pEx
2060: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
2070: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2080: 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65  =op ){.    where
2090: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
20a0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  , pExpr, 0);.  }
20b0: 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53  else{.    whereS
20c0: 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d  plit(pWC, pExpr-
20d0: 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20  >pLeft, op);.   
20e0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
20f0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
2100: 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  op);.  }.}../*.*
2110: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
2120: 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65  hereMaskSet obje
2130: 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e  ct.*/.#define in
2140: 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28 50  itMaskSet(P)  (P
2150: 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52 65  )->n=0../*.** Re
2160: 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  turn the bitmask
2170: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
2180: 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52  ursor number.  R
2190: 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43  eturn 0 if.** iC
21a0: 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
21b0: 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  the set..*/.stat
21c0: 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61  ic Bitmask getMa
21d0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
21e0: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
21f0: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69  Cursor){.  int i
2200: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73  ;.  assert( pMas
2210: 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69  kSet->n<=(int)si
2220: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20  zeof(Bitmask)*8 
2230: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2240: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b  pMaskSet->n; i++
2250: 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b  ){.    if( pMask
2260: 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72  Set->ix[i]==iCur
2270: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sor ){.      ret
2280: 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a  urn MASKBIT(i);.
2290: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
22b0: 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b  reate a new mask
22c0: 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72   for cursor iCur
22d0: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  sor..**.** There
22e0: 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70   is one cursor p
22f0: 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  er table in the 
2300: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
2310: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74  e number of.** t
2320: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2330: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
2340: 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61  ted by a test ea
2350: 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71  rly in the.** sq
2360: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2370: 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77  ) routine.  So w
2380: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
2390: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a  pMaskSet->ix[].*
23a0: 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76  * array will nev
23b0: 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a  er overflow..*/.
23c0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
23d0: 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  teMask(WhereMask
23e0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
23f0: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61  nt iCursor){.  a
2400: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
2410: 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70  >n < ArraySize(p
2420: 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a  MaskSet->ix) );.
2430: 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70    pMaskSet->ix[p
2440: 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20  MaskSet->n++] = 
2450: 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCursor;.}../*.*
2460: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
2470: 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76 65   walk (recursive
2480: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
2490: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
24a0: 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b  ate.** a bitmask
24b0: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63   indicating whic
24c0: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65  h tables are use
24d0: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  d in that expres
24e0: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2f  sion.** tree..*/
24f0: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
2500: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2510: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
2520: 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
2530: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
2540: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
2550: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c  e(WhereMaskSet*,
2560: 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69   Select*);.stati
2570: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61  c Bitmask exprTa
2580: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2590: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
25a0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
25b0: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
25c0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
25d0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  rn 0;.  if( p->o
25e0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
25f0: 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61      mask = getMa
2600: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  sk(pMaskSet, p->
2610: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74  iTable);.    ret
2620: 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20  urn mask;.  }.  
2630: 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65  mask = exprTable
2640: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2650: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61  p->pRight);.  ma
2660: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
2670: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2680: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
2690: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26a0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
26b0: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20   ){.    mask |= 
26c0: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
26d0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
26e0: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
26f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20  }else{.    mask 
2700: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
2710: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2720: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
2730: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
2740: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
2750: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2760: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2770: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
2780: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
2790: 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b  int i;.  Bitmask
27a0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
27b0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
27c0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
27d0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
27e0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
27f0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2800: 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  et, pList->a[i].
2810: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2820: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
2830: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
2840: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
2850: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
2860: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53  Set *pMaskSet, S
2870: 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69  elect *pS){.  Bi
2880: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
2890: 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20    while( pS ){. 
28a0: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
28b0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
28c0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
28d0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
28e0: 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74  kSet, pS->pEList
28f0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2900: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2910: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
2920: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d  pGroupBy);.    m
2930: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
2940: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2950: 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79  et, pS->pOrderBy
2960: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2970: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
2980: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65  askSet, pS->pWhe
2990: 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  re);.    mask |=
29a0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
29b0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48  pMaskSet, pS->pH
29c0: 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20  aving);.    if( 
29d0: 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29 20  ALWAYS(pSrc!=0) 
29e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
29f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2a00: 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
2a10: 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20  ){.        mask 
2a20: 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  |= exprSelectTab
2a30: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2a40: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  , pSrc->a[i].pSe
2a50: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d  lect);.        m
2a60: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2a70: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2a80: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b  pSrc->a[i].pOn);
2a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2aa0: 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69     pS = pS->pPri
2ab0: 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
2ac0: 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   mask;.}../*.** 
2ad0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2ae0: 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f  he given operato
2af0: 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  r is one of the 
2b00: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2b10: 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72  s.** allowed for
2b20: 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48   an indexable WH
2b30: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
2b40: 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70    The allowed op
2b50: 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22  erators are.** "
2b60: 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c  =", "<", ">", "<
2b70: 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c 20  =", ">=", "IN", 
2b80: 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a 2f  and "IS NULL".*/
2b90: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
2ba0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
2bb0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
2bc0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
2bd0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2be0: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
2bf0: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
2c00: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
2c10: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
2c20: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2c30: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
2c40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
2c50: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
2c60: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
2c70: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
2c80: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  LL;.}../*.** Com
2c90: 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f  mute a compariso
2ca0: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70  n operator.  Exp
2cb0: 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
2cc0: 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a  form "X op Y".**
2cd0: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
2ce0: 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a  nto "Y op X"..**
2cf0: 0a 2a 2a 20 49 66 20 6c 65 66 74 2f 72 69 67 68  .** If left/righ
2d00: 74 20 70 72 65 63 65 64 65 6e 63 65 20 72 75 6c  t precedence rul
2d10: 65 73 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61  es come into pla
2d20: 79 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69  y when determini
2d30: 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74  ng the.** collat
2d40: 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 74 68  ing sequence, th
2d50: 65 6e 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  en COLLATE opera
2d60: 74 6f 72 73 20 61 72 65 20 61 64 6a 75 73 74 65  tors are adjuste
2d70: 64 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74  d to ensure.** t
2d80: 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  hat the collatin
2d90: 67 20 73 65 71 75 65 6e 63 65 20 64 6f 65 73 20  g sequence does 
2da0: 6e 6f 74 20 63 68 61 6e 67 65 2e 20 20 46 6f 72  not change.  For
2db0: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59 20   example:.** "Y 
2dc0: 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f  collate NOCASE o
2dd0: 70 20 58 22 20 62 65 63 6f 6d 65 73 20 22 58 20  p X" becomes "X 
2de0: 6f 70 20 59 22 20 62 65 63 61 75 73 65 20 61 6e  op Y" because an
2df0: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
2e00: 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c  ence on.** the l
2e10: 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  eft hand side of
2e20: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76   a comparison ov
2e30: 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c  errides any coll
2e40: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a  ation sequence .
2e50: 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ** attached to t
2e60: 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68  he right. For th
2e70: 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68  e same reason th
2e80: 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61  e EP_Collate fla
2e90: 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d  g.** is not comm
2ea0: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
2eb0: 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65  void exprCommute
2ec0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2ed0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2ee0: 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20 28  u16 expRight = (
2ef0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
2f00: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
2f10: 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66  e);.  u16 expLef
2f20: 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66  t = (pExpr->pLef
2f30: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
2f40: 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  llate);.  assert
2f50: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70  ( allowedOp(pExp
2f60: 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d  r->op) && pExpr-
2f70: 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op!=TK_IN );.  
2f80: 69 66 28 20 65 78 70 52 69 67 68 74 3d 3d 65 78  if( expRight==ex
2f90: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a 20  pLeft ){.    /* 
2fa0: 45 69 74 68 65 72 20 58 20 61 6e 64 20 59 20 62  Either X and Y b
2fb0: 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c 41 54 45  oth have COLLATE
2fc0: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 6e 65 69   operator or nei
2fd0: 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20 69  ther do */.    i
2fe0: 66 28 20 65 78 70 52 69 67 68 74 20 29 7b 0a 20  f( expRight ){. 
2ff0: 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 58 20 61       /* Both X a
3000: 6e 64 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54  nd Y have COLLAT
3010: 45 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d 61  E operators.  Ma
3020: 6b 65 20 73 75 72 65 20 58 20 69 73 20 61 6c 77  ke sure X is alw
3030: 61 79 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 65  ays.      ** use
3040: 64 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68  d by clearing th
3050: 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61  e EP_Collate fla
3060: 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20  g from Y. */.   
3070: 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
3080: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43  ->flags &= ~EP_C
3090: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73  ollate;.    }els
30a0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70  e if( sqlite3Exp
30b0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
30c0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
30d0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65  0 ){.      /* Ne
30e0: 69 74 68 65 72 20 58 20 6e 6f 72 20 59 20 68 61  ither X nor Y ha
30f0: 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  ve COLLATE opera
3100: 74 6f 72 73 2c 20 62 75 74 20 58 20 68 61 73 20  tors, but X has 
3110: 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20 20  a non-default.  
3120: 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67      ** collating
3130: 20 73 65 71 75 65 6e 63 65 2e 20 20 53 6f 20 61   sequence.  So a
3140: 64 64 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74  dd the EP_Collat
3150: 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74 6f  e marker on X to
3160: 20 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20   cause.      ** 
3170: 69 74 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  it to be searche
3180: 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20  d first. */.    
3190: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e    pExpr->pLeft->
31a0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c  flags |= EP_Coll
31b0: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ate;.    }.  }. 
31c0: 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70   SWAP(Expr*,pExp
31d0: 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d  r->pRight,pExpr-
31e0: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
31f0: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
3200: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ){.    assert( T
3210: 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
3220: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
3230: 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20  GE==TK_LE+2 );. 
3240: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
3250: 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  >TK_EQ );.    as
3260: 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c  sert( TK_GT<TK_L
3270: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
3280: 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47   pExpr->op>=TK_G
3290: 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d  T && pExpr->op<=
32a0: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78  TK_GE );.    pEx
32b0: 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72  pr->op = ((pExpr
32c0: 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54  ->op-TK_GT)^2)+T
32d0: 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  K_GT;.  }.}../*.
32e0: 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f  ** Translate fro
32f0: 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72  m TK_xx operator
3300: 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73   to WO_xx bitmas
3310: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  k..*/.static u16
3320: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e   operatorMask(in
3330: 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a  t op){.  u16 c;.
3340: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
3350: 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28  dOp(op) );.  if(
3360: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20   op==TK_IN ){.  
3370: 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d    c = WO_IN;.  }
3380: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
3390: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20  ISNULL ){.    c 
33a0: 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d  = WO_ISNULL;.  }
33b0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
33c0: 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b  ( (WO_EQ<<(op-TK
33d0: 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20 29  _EQ)) < 0x7fff )
33e0: 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29 28  ;.    c = (u16)(
33f0: 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51  WO_EQ<<(op-TK_EQ
3400: 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ));.  }.  assert
3410: 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op!=TK_ISNULL 
3420: 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  || c==WO_ISNULL 
3430: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
3440: 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_IN || c==WO_
3450: 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IN );.  assert( 
3460: 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d  op!=TK_EQ || c==
3470: 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72  WO_EQ );.  asser
3480: 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  t( op!=TK_LT || 
3490: 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73  c==WO_LT );.  as
34a0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20  sert( op!=TK_LE 
34b0: 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20  || c==WO_LE );. 
34c0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
34d0: 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29  GT || c==WO_GT )
34e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
34f0: 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47  TK_GE || c==WO_G
3500: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b  E );.  return c;
3510: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
3520: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 57 68  e to the next Wh
3530: 65 72 65 54 65 72 6d 20 74 68 61 74 20 6d 61 74  ereTerm that mat
3540: 63 68 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  ches according t
3550: 6f 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a  o the criteria.*
3560: 2a 20 65 73 74 61 62 6c 69 73 68 65 64 20 77 68  * established wh
3570: 65 6e 20 74 68 65 20 70 53 63 61 6e 20 6f 62 6a  en the pScan obj
3580: 65 63 74 20 77 61 73 20 69 6e 69 74 69 61 6c 69  ect was initiali
3590: 7a 65 64 20 62 79 20 77 68 65 72 65 53 63 61 6e  zed by whereScan
35a0: 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72  Init()..** Retur
35b0: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  n NULL if there 
35c0: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63  are no more matc
35d0: 68 69 6e 67 20 57 68 65 72 65 54 65 72 6d 73 2e  hing WhereTerms.
35e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
35f0: 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e  Term *whereScanN
3600: 65 78 74 28 57 68 65 72 65 53 63 61 6e 20 2a 70  ext(WhereScan *p
3610: 53 63 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75  Scan){.  int iCu
3620: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
3630: 20 54 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 74   The cursor on t
3640: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65  he LHS of the te
3650: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  rm */.  int iCol
3660: 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  umn;         /* 
3670: 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  The column on th
3680: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72  e LHS of the ter
3690: 6d 2e 20 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a  m.  -1 for IPK *
36a0: 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20  /.  Expr *pX;   
36b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
36c0: 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20  xpression being 
36d0: 74 65 73 74 65 64 20 2a 2f 0a 20 20 57 68 65 72  tested */.  Wher
36e0: 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
36f0: 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f   /* Shorthand fo
3700: 72 20 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a  r pScan->pWC */.
3710: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
3720: 72 6d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65  rm;    /* The te
3730: 72 6d 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  rm being tested 
3740: 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53 63  */.  int k = pSc
3750: 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68 65  an->k;    /* Whe
3760: 72 65 20 74 6f 20 73 74 61 72 74 20 73 63 61 6e  re to start scan
3770: 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77 68 69 6c 65  ning */..  while
3780: 28 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c  ( pScan->iEquiv<
3790: 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29  =pScan->nEquiv )
37a0: 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 70 53 63  {.    iCur = pSc
37b0: 61 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e  an->aEquiv[pScan
37c0: 2d 3e 69 45 71 75 69 76 2d 32 5d 3b 0a 20 20 20  ->iEquiv-2];.   
37d0: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 53 63 61 6e   iColumn = pScan
37e0: 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e  ->aEquiv[pScan->
37f0: 69 45 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20 77  iEquiv-1];.    w
3800: 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53 63  hile( (pWC = pSc
3810: 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20  an->pWC)!=0 ){. 
3820: 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70       for(pTerm=p
3830: 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e  WC->a+k; k<pWC->
3840: 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72  nTerm; k++, pTer
3850: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
3860: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
3870: 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20  sor==iCur.      
3880: 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c     && pTerm->u.l
3890: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
38a0: 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  mn.         && (
38b0: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 32  pScan->iEquiv<=2
38c0: 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70   || !ExprHasProp
38d0: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
38e0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
38f0: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
3900: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
3910: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
3920: 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20  _EQUIV)!=0.     
3930: 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e        && pScan->
3940: 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65  nEquiv<ArraySize
3950: 28 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 29 0a  (pScan->aEquiv).
3960: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
3970: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
3980: 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20 3d              pX =
3990: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
39a0: 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70  Collate(pTerm->p
39b0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
39c0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
39d0: 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  t( pX->op==TK_CO
39e0: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
39f0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3a00: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b  Scan->nEquiv; j+
3a10: 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  =2){.           
3a20: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 61 45     if( pScan->aE
3a30: 71 75 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54 61  quiv[j]==pX->iTa
3a40: 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
3a50: 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 61 45 71     && pScan->aEq
3a60: 75 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69 43  uiv[j+1]==pX->iC
3a70: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
3a80: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
3a90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3aa0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
3ac0: 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76  j==pScan->nEquiv
3ad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3ae0: 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b    pScan->aEquiv[
3af0: 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b  j] = pX->iTable;
3b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
3b10: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31  Scan->aEquiv[j+1
3b20: 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3b  ] = pX->iColumn;
3b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
3b40: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d 20  Scan->nEquiv += 
3b50: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  2;.            }
3b60: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3b70: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
3b80: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70  m->eOperator & p
3b90: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30  Scan->opMask)!=0
3ba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3bb0: 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61 66  /* Verify the af
3bc0: 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61  finity and colla
3bd0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61  ting sequence ma
3be0: 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
3bf0: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43     if( pScan->zC
3c00: 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72  ollName && (pTer
3c10: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
3c20: 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  O_ISNULL)==0 ){.
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f                Co
3c40: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72 73              Pars
3c60: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
3c70: 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b  >pWInfo->pParse;
3c80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
3c90: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
3ca0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3cb0: 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
3cc0: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20  xAffinityOk(pX, 
3cd0: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29  pScan->idxaff) )
3ce0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3cf0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
3d00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3d10: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
3d20: 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  (pX->pLeft);.   
3d30: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
3d40: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
3d50: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
3d60: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d90: 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65           pX->pLe
3da0: 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  ft, pX->pRight);
3db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
3dc0: 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43  f( pColl==0 ) pC
3dd0: 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
3de0: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
3df0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
3e00: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
3e10: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61  oll->zName, pSca
3e20: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b  n->zCollName) ){
3e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3e40: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
3e50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3e60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3e70: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
3e80: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
3e90: 45 51 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  EQ)!=0.         
3ea0: 20 20 20 20 26 26 20 28 70 58 20 3d 20 70 54 65      && (pX = pTe
3eb0: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
3ec0: 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  t)->op==TK_COLUM
3ed0: 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  N.             &
3ee0: 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  & pX->iTable==pS
3ef0: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a 20  can->aEquiv[0]. 
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
3f10: 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63 61  X->iColumn==pSca
3f20: 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20 20  n->aEquiv[1].   
3f30: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
3f40: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
3f50: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
3f60: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  }.            pS
3f70: 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20  can->k = k+1;.  
3f80: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
3f90: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
3fa0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
3fb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61      }.      pSca
3fc0: 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  n->pWC = pScan->
3fd0: 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20  pWC->pOuter;.   
3fe0: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a     k = 0;.    }.
3ff0: 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d      pScan->pWC =
4000: 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b   pScan->pOrigWC;
4010: 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20  .    k = 0;.    
4020: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b 3d  pScan->iEquiv +=
4030: 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   2;.  }.  return
4040: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   0;.}../*.** Ini
4050: 74 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20  tialize a WHERE 
4060: 63 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f  clause scanner o
4070: 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61  bject.  Return a
4080: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
4090: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20  ** first match. 
40a0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
40b0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74  there are no mat
40c0: 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ches..**.** The 
40d0: 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20  scanner will be 
40e0: 73 65 61 72 63 68 69 6e 67 20 74 68 65 20 57 48  searching the WH
40f0: 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20  ERE clause pWC. 
4100: 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a   It will look.**
4110: 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68   for terms of th
4120: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
4130: 65 78 70 72 3e 22 20 77 68 65 72 65 20 58 20 69  expr>" where X i
4140: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e  s column iColumn
4150: 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75   of table.** iCu
4160: 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73  r.  The <op> mus
4170: 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  t be one of the 
4180: 6f 70 65 72 61 74 6f 72 73 20 64 65 73 63 72 69  operators descri
4190: 62 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a  bed by opMask..*
41a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72  *.** If the sear
41b0: 63 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20  ch is for X and 
41c0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
41d0: 20 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20   contains terms 
41e0: 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58  of the.** form X
41f0: 3d 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  =Y then this rou
4200: 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20  tine might also 
4210: 72 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20  return terms of 
4220: 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c  the form.** "Y <
4230: 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68  op> <expr>".  Th
4240: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  e number of leve
4250: 6c 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69  ls of transitivi
4260: 74 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a  ty is limited,.*
4270: 2a 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20  * but is enough 
4280: 74 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63  to handle most c
4290: 6f 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e  ommonly occurrin
42a0: 67 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  g SQL statements
42b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20  ..**.** If X is 
42c0: 6e 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52 20  not the INTEGER 
42d0: 50 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e  PRIMARY KEY then
42e0: 20 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61   X must be compa
42f0: 74 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e  tible with.** in
4300: 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61  dex pIdx..*/.sta
4310: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77  tic WhereTerm *w
4320: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20  hereScanInit(.  
4330: 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e  WhereScan *pScan
4340: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  ,       /* The W
4350: 68 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20  hereScan object 
4360: 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65  being initialize
4370: 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  d */.  WhereClau
4380: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f  se *pWC,       /
4390: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
43a0: 73 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  se to be scanned
43b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
43d0: 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
43e0: 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  for */.  int iCo
43f0: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
4400: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63   /* Column to sc
4410: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20  an for */.  u32 
4420: 6f 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20  opMask,         
4430: 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28      /* Operator(
4440: 73 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  s) to scan for *
4450: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
4460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
4470: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
4480: 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65  e with this inde
4490: 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 3b  x */.){.  int j;
44a0: 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53  ..  /* memset(pS
44b0: 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  can, 0, sizeof(*
44c0: 70 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53  pScan)); */.  pS
44d0: 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70  can->pOrigWC = p
44e0: 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43  WC;.  pScan->pWC
44f0: 20 3d 20 70 57 43 3b 0a 20 20 69 66 28 20 70 49   = pWC;.  if( pI
4500: 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30  dx && iColumn>=0
4510: 20 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69   ){.    pScan->i
4520: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
4530: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
4540: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
4550: 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d    for(j=0; pIdx-
4560: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43  >aiColumn[j]!=iC
4570: 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
4580: 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 70     if( NEVER(j>p
4590: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20  Idx->nColumn) ) 
45a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
45b0: 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c      pScan->zColl
45c0: 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Name = pIdx->azC
45d0: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b  oll[j];.  }else{
45e0: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  .    pScan->idxa
45f0: 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61  ff = 0;.    pSca
4600: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30  n->zCollName = 0
4610: 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f  ;.  }.  pScan->o
4620: 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a  pMask = opMask;.
4630: 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a    pScan->k = 0;.
4640: 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b    pScan->aEquiv[
4650: 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63  0] = iCur;.  pSc
4660: 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 20 3d 20  an->aEquiv[1] = 
4670: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e  iColumn;.  pScan
4680: 2d 3e 6e 45 71 75 69 76 20 3d 20 32 3b 0a 20 20  ->nEquiv = 2;.  
4690: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20  pScan->iEquiv = 
46a0: 32 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72  2;.  return wher
46b0: 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29  eScanNext(pScan)
46c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
46d0: 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20  h for a term in 
46e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
46f0: 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20   that is of the 
4700: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
4710: 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20  pr>".** where X 
4720: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
4730: 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66  o the iColumn of
4740: 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20   table iCur and 
4750: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a  <op> is one of.*
4760: 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72  * the WO_xx oper
4770: 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69  ator codes speci
4780: 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70  fied by the op p
4790: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74  arameter..** Ret
47a0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
47b0: 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75   the term.  Retu
47c0: 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e  rn 0 if not foun
47d0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  d..**.** The ter
47e0: 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74  m returned might
47f0: 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20   by Y=<expr> if 
4800: 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72  there is another
4810: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a   constraint in.*
4820: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
4830: 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  se that specifie
4840: 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79  s that X=Y.  Any
4850: 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74   such constraint
4860: 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65  s will be.** ide
4870: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57  ntified by the W
4880: 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74  O_EQUIV bit in t
4890: 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  he pTerm->eOpera
48a0: 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a  tor field.  The.
48b0: 2a 2a 20 61 45 71 75 69 76 5b 5d 20 61 72 72 61  ** aEquiv[] arra
48c0: 79 20 68 6f 6c 64 73 20 58 20 61 6e 64 20 61 6c  y holds X and al
48d0: 6c 20 69 74 73 20 65 71 75 69 76 61 6c 65 6e 74  l its equivalent
48e0: 73 2c 20 77 69 74 68 20 65 61 63 68 20 53 51 4c  s, with each SQL
48f0: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 61 6b   variable.** tak
4900: 69 6e 67 20 75 70 20 74 77 6f 20 73 6c 6f 74 73  ing up two slots
4910: 20 69 6e 20 61 45 71 75 69 76 5b 5d 2e 20 20 54   in aEquiv[].  T
4920: 68 65 20 66 69 72 73 74 20 73 6c 6f 74 20 69 73  he first slot is
4930: 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 20   for the cursor 
4940: 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20 74 68  number.** and th
4950: 65 20 73 65 63 6f 6e 64 20 69 73 20 66 6f 72 20  e second is for 
4960: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
4970: 72 2e 20 20 54 68 65 72 65 20 61 72 65 20 32 32  r.  There are 22
4980: 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76   slots in aEquiv
4990: 5b 5d 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6d 65  [].** so that me
49a0: 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20  ans we can look 
49b0: 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74 6f  for X plus up to
49c0: 20 31 30 20 6f 74 68 65 72 20 65 71 75 69 76 61   10 other equiva
49d0: 6c 65 6e 74 20 76 61 6c 75 65 73 2e 0a 2a 2a 20  lent values..** 
49e0: 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20 66  Hence a search f
49f0: 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72 6e  or X will return
4a00: 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31 20   <expr> if X=A1 
4a10: 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41 32  and A1=A2 and A2
4a20: 3d 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e 2e 20 61  =A3.** and ... a
4a30: 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41 31  nd A9=A10 and A1
4a40: 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20  0=<expr>..**.** 
4a50: 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c  If there are mul
4a60: 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74  tiple terms in t
4a70: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4a80: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
4a90: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74  op> <expr>".** t
4aa0: 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65 20  hen try for the 
4ab0: 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70 65  one with no depe
4ac0: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70  ndencies on <exp
4ad0: 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f  r> - in other wo
4ae0: 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78  rds where.** <ex
4af0: 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  pr> is a constan
4b00: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  t expression of 
4b10: 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79  some kind.  Only
4b20: 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73 20   return entries 
4b30: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
4b40: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
4b50: 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  Y is a column in
4b60: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
4b70: 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a  f no terms of.**
4b80: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
4b90: 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20  > <const-expr>" 
4ba0: 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20 74  exist.   If no t
4bb0: 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e 73  erms with a cons
4bc0: 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69 73  tant RHS.** exis
4bd0: 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72 6e  t, try to return
4be0: 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f 65   a term that doe
4bf0: 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51 55  s not use WO_EQU
4c00: 49 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  IV..*/.static Wh
4c10: 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72  ereTerm *findTer
4c20: 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m(.  WhereClause
4c30: 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68   *pWC,     /* Th
4c40: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
4c50: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f  o be searched */
4c60: 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
4c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
4c80: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53  or number of LHS
4c90: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
4ca0: 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  n,          /* C
4cb0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
4cc0: 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  LHS */.  Bitmask
4cd0: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
4ce0: 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f  * RHS must not o
4cf0: 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73  verlap with this
4d00: 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f   mask */.  u32 o
4d10: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
4d20: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78   /* Mask of WO_x
4d30: 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62  x values describ
4d40: 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ing operator */.
4d50: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
4d60: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
4d70: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
4d80: 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69  th this index, i
4d90: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
4da0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52  .  WhereTerm *pR
4db0: 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57 68 65  esult = 0;.  Whe
4dc0: 72 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57 68 65  reTerm *p;.  Whe
4dd0: 72 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a 20 20  reScan scan;..  
4de0: 70 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69  p = whereScanIni
4df0: 74 28 26 73 63 61 6e 2c 20 70 57 43 2c 20 69 43  t(&scan, pWC, iC
4e00: 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c  ur, iColumn, op,
4e10: 20 70 49 64 78 29 3b 0a 20 20 77 68 69 6c 65 28   pIdx);.  while(
4e20: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70   p ){.    if( (p
4e30: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
4e40: 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a  notReady)==0 ){.
4e50: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65        if( p->pre
4e60: 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28  reqRight==0 && (
4e70: 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f  p->eOperator&WO_
4e80: 45 51 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  EQ)!=0 ){.      
4e90: 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20    return p;.    
4ea0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 52    }.      if( pR
4eb0: 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73 75  esult==0 ) pResu
4ec0: 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  lt = p;.    }.  
4ed0: 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 4e    p = whereScanN
4ee0: 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d 0a  ext(&scan);.  }.
4ef0: 20 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c 74    return pResult
4f00: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
4f10: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
4f20: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
4f30: 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20 57  lyze(SrcList*, W
4f40: 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74  hereClause*, int
4f50: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65  );../*.** Call e
4f60: 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c  xprAnalyze on al
4f70: 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45  l terms in a WHE
4f80: 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2f 0a  RE clause.  .*/.
4f90: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
4fa0: 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72  AnalyzeAll(.  Sr
4fb0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
4fc0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
4fd0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
4fe0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20  hereClause *pWC 
4ff0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
5000: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
5010: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
5020: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5030: 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20  i=pWC->nTerm-1; 
5040: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
5050: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62  exprAnalyze(pTab
5060: 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20  List, pWC, i);. 
5070: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
5080: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
5090: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  PTIMIZATION./*.*
50a0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
50b0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
50c0: 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45  ession is a LIKE
50d0: 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f   or GLOB operato
50e0: 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  r that.** can be
50f0: 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
5100: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
5110: 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e  traints.  Return
5120: 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a   TRUE if it is.*
5130: 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69  * so and false i
5140: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  f not..**.** In 
5150: 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70  order for the op
5160: 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74  erator to be opt
5170: 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48  imizible, the RH
5180: 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72 69  S must be a stri
5190: 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68  ng.** literal th
51a0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  at does not begi
51b0: 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72  n with a wildcar
51c0: 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  d.  .*/.static i
51d0: 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  nt isLikeOrGlob(
51e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
51f0: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
5200: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
5210: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
5220: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
5230: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
5240: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
5250: 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c  Expr **ppPrefix,
5260: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
5270: 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73  TK_STRING expres
5280: 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72  sion with patter
5290: 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e  n prefix */.  in
52a0: 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20  t *pisComplete, 
52b0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f  /* True if the o
52c0: 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73 20  nly wildcard is 
52d0: 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68  % in the last ch
52e0: 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74  aracter */.  int
52f0: 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f   *pnoCase      /
5300: 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72 63  * True if upperc
5310: 61 73 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ase is equivalen
5320: 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a  t to lowercase *
5330: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
5340: 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20 20  r *z = 0;       
5350: 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52    /* String on R
5360: 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61  HS of LIKE opera
5370: 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  tor */.  Expr *p
5380: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20  Right, *pLeft;  
5390: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e 64      /* Right and
53a0: 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c 49   left size of LI
53b0: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
53c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
53d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
53e0: 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73 20  ist of operands 
53f0: 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72  to the LIKE oper
5400: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b  ator */.  int c;
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72       /* One char
5430: 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a  acter in z[] */.
5440: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5460: 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69  Number of non-wi
5470: 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63 68  ldcard prefix ch
5480: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63 68  aracters */.  ch
5490: 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20 20  ar wc[3];       
54a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 64           /* Wild
54b0: 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20  card characters 
54c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
54d0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
54e0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
54f0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  ection */.  sqli
5500: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20  te3_value *pVal 
5510: 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20  = 0;.  int op;  
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70    /* Opcode of p
5540: 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20  Right */..  if( 
5550: 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75  !sqlite3IsLikeFu
5560: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72  nction(db, pExpr
5570: 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29  , pnoCase, wc) )
5580: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5590: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
55a0: 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a  E_EBCDIC.  if( *
55b0: 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e  pnoCase ) return
55c0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69   0;.#endif.  pLi
55d0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
55e0: 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70  ist;.  pLeft = p
55f0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
5600: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  ;.  if( pLeft->o
5610: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20  p!=TK_COLUMN .  
5620: 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41   || sqlite3ExprA
5630: 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d  ffinity(pLeft)!=
5640: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
5650: 0a 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  .   || IsVirtual
5660: 28 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a 20 20  (pLeft->pTab).  
5670: 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ){.    /* IMP: R
5680: 2d 30 32 30 36 35 2d 34 39 34 36 35 20 54 68 65  -02065-49465 The
5690: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
56a0: 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47  of the LIKE or G
56b0: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75 73  LOB operator mus
56c0: 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
56d0: 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65 78  name of an index
56e0: 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54  ed column with T
56f0: 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f  EXT affinity. */
5700: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5710: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65   }.  assert( pLe
5720: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31  ft->iColumn!=(-1
5730: 29 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  ) ); /* Because 
5740: 49 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41 46  IPK never has AF
5750: 46 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69  F_TEXT */..  pRi
5760: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
5770: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
5780: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
5790: 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e  .  op = pRight->
57a0: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
57b0: 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20  _VARIABLE ){.   
57c0: 20 56 64 62 65 20 2a 70 52 65 70 72 65 70 61 72   Vdbe *pReprepar
57d0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65 70  e = pParse->pRep
57e0: 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e 74 20  repare;.    int 
57f0: 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d 3e 69  iCol = pRight->i
5800: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56 61 6c  Column;.    pVal
5810: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
5820: 74 42 6f 75 6e 64 56 61 6c 75 65 28 70 52 65 70  tBoundValue(pRep
5830: 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51  repare, iCol, SQ
5840: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a  LITE_AFF_NONE);.
5850: 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26 20      if( pVal && 
5860: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
5870: 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45  pe(pVal)==SQLITE
5880: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a  _TEXT ){.      z
5890: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
58a0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56  e3_value_text(pV
58b0: 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  al);.    }.    s
58c0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
58d0: 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64  mask(pParse->pVd
58e0: 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 61  be, iCol);.    a
58f0: 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f  ssert( pRight->o
5900: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c  p==TK_VARIABLE |
5910: 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  | pRight->op==TK
5920: 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 7d  _REGISTER );.  }
5930: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
5940: 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20  STRING ){.    z 
5950: 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  = pRight->u.zTok
5960: 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20  en;.  }.  if( z 
5970: 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a  ){.    cnt = 0;.
5980: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b      while( (c=z[
5990: 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77  cnt])!=0 && c!=w
59a0: 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d  c[0] && c!=wc[1]
59b0: 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a   && c!=wc[2] ){.
59c0: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
59d0: 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d   }.    if( cnt!=
59e0: 30 20 26 26 20 32 35 35 21 3d 28 75 38 29 7a 5b  0 && 255!=(u8)z[
59f0: 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20  cnt-1] ){.      
5a00: 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b 0a 20  Expr *pPrefix;. 
5a10: 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74       *pisComplet
5a20: 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20  e = c==wc[0] && 
5a30: 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20  z[cnt+1]==0;.   
5a40: 20 20 20 70 50 72 65 66 69 78 20 3d 20 73 71 6c     pPrefix = sql
5a50: 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
5a60: 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20  STRING, z);.    
5a70: 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29 20    if( pPrefix ) 
5a80: 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65  pPrefix->u.zToke
5a90: 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20  n[cnt] = 0;.    
5aa0: 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70 50    *ppPrefix = pP
5ab0: 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69 66 28  refix;.      if(
5ac0: 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45   op==TK_VARIABLE
5ad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65   ){.        Vdbe
5ae0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
5af0: 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  dbe;.        sql
5b00: 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
5b10: 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69 43  sk(v, pRight->iC
5b20: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
5b30: 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65  if( *pisComplete
5b40: 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54   && pRight->u.zT
5b50: 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20  oken[1] ){.     
5b60: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
5b70: 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 65  hs of the LIKE e
5b80: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
5b90: 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68 65  ariable, and the
5ba0: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20   current.       
5bb0: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
5bc0: 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61 6e  he variable mean
5bd0: 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  s there is no ne
5be0: 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ed to invoke the
5bf0: 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20 20   LIKE.          
5c00: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  ** function, the
5c10: 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65  n no OP_Variable
5c20: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
5c30: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20  o the program.. 
5c40: 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
5c50: 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d 73   causes problems
5c60: 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
5c70: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
5c80: 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20 20  name().         
5c90: 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b   ** API. To work
5ca0: 20 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64   around them, ad
5cb0: 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72  d a dummy OP_Var
5cc0: 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20  iable here..    
5cd0: 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
5ce0: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
5cf0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
5d00: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
5d10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
5d20: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
5d30: 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20  pRight, r1);.   
5d40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5d50: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71  beChangeP3(v, sq
5d60: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
5d70: 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20  Addr(v)-1, 0);. 
5d80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5d90: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5da0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5db0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5dc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
5dd0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
5de0: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
5df0: 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74  ree(pVal);.  ret
5e00: 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65  urn (z!=0);.}.#e
5e10: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
5e20: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
5e30: 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64  ATION */...#ifnd
5e40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
5e50: 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
5e60: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
5e70: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
5e80: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
5e90: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
5ea0: 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48      column MATCH
5eb0: 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69   expr.**.** If i
5ec0: 74 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e  t is then return
5ed0: 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20   TRUE.  If not, 
5ee0: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
5ef0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61  .static int isMa
5f00: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45  tchOfColumn(.  E
5f10: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
5f20: 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70  /* Test this exp
5f30: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
5f40: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
5f50: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ..  if( pExpr->o
5f60: 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p!=TK_FUNCTION )
5f70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5f80: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
5f90: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
5fa0: 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22  u.zToken,"match"
5fb0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
5fc0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
5fd0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
5fe0: 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  st;.  if( pList-
5ff0: 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20  >nExpr!=2 ){.   
6000: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6010: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d   if( pList->a[1]
6020: 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b  .pExpr->op != TK
6030: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72  _COLUMN ){.    r
6040: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
6050: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
6060: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6070: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
6080: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ../*.** If the p
6090: 42 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  Base expression 
60a0: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
60b0: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
60c0: 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69  ause of.** a joi
60d0: 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  n, then transfer
60e0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
60f0: 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74   markings over t
6100: 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74  o derived..*/.st
6110: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66  atic void transf
6120: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45  erJoinMarkings(E
6130: 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45  xpr *pDerived, E
6140: 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 69  xpr *pBase){.  i
6150: 66 28 20 70 44 65 72 69 76 65 64 20 29 7b 0a 20  f( pDerived ){. 
6160: 20 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61     pDerived->fla
6170: 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61  gs |= pBase->fla
6180: 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  gs & EP_FromJoin
6190: 3b 0a 20 20 20 20 70 44 65 72 69 76 65 64 2d 3e  ;.    pDerived->
61a0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
61b0: 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a  = pBase->iRightJ
61c0: 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 7d 0a  oinTable;.  }.}.
61d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
61e0: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
61f0: 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64  IMIZATION) && !d
6200: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6210: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a  IT_SUBQUERY)./*.
6220: 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72  ** Analyze a ter
6230: 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  m that consists 
6240: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f  of two or more O
6250: 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73  R-connected.** s
6260: 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a  ubterms.  So in:
6270: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57  .**.**     ... W
6280: 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e 44 20  HERE  (a=5) AND 
6290: 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20 64  (b=7 OR c=9 OR d
62a0: 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33 29 0a  =13) AND (d=13).
62b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e              ^^^^
62d0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
62e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
62f0: 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 65 72  ine analyzes ter
6300: 6d 73 20 73 75 63 68 20 61 73 20 74 68 65 20 6d  ms such as the m
6310: 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20 74 68  iddle term in th
6320: 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e  e above example.
6330: 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54 65 72  .** A WhereOrTer
6340: 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d 70  m object is comp
6350: 75 74 65 64 20 61 6e 64 20 61 74 74 61 63 68 65  uted and attache
6360: 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20 75 6e  d to the term un
6370: 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c  der.** analysis,
6380: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
6390: 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68  he outcome of th
63a0: 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e  e analysis.  Hen
63b0: 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  ce:.**.**     Wh
63c0: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 20  ereTerm.wtFlags 
63d0: 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46    |=  TERM_ORINF
63e0: 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  O.**     WhereTe
63f0: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20  rm.u.pOrInfo  = 
6400: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
6410: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 4f 72  llocated WhereOr
6420: 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a  Term object.**.*
6430: 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67  * The term being
6440: 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20 68   analyzed must h
6450: 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ave two or more 
6460: 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  of OR-connected 
6470: 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73  subterms..** A s
6480: 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20 6d 69  ingle subterm mi
6490: 67 68 74 20 62 65 20 61 20 73 65 74 20 6f 66 20  ght be a set of 
64a0: 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75  AND-connected su
64b0: 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45  b-subterms..** E
64c0: 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d 73  xamples of terms
64d0: 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69 73 3a   under analysis:
64e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20 20  .**.**     (A)  
64f0: 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20     t1.x=t2.y OR 
6500: 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e  t1.x=t2.z OR t1.
6510: 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e  y=15 OR t1.z=t3.
6520: 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29 20 20  a+5.**     (B)  
6530: 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 65 78     x=expr1 OR ex
6540: 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70 72 33  pr2=x OR x=expr3
6550: 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20 20 20  .**     (C)     
6560: 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74 31  t1.x=t2.y OR (t1
6570: 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79  .x=t2.z AND t1.y
6580: 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44 29 20  =15).**     (D) 
6590: 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 28      x=expr1 OR (
65a0: 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20 41 4e  y>11 AND y<22 AN
65b0: 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f  D z LIKE '*hello
65c0: 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29 20 20  *').**     (E)  
65d0: 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e     (p.a=1 AND q.
65e0: 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f  b=2 AND r.c=3) O
65f0: 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79  R (p.x=4 AND q.y
6600: 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a  =5 AND r.z=6).**
6610: 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a  .** CASE 1:.**.*
6620: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
6630: 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72  s are of the for
6640: 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 20 73  m T.C=expr for s
6650: 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  ome single colum
6660: 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a 20 61 20  n of C and.** a 
6670: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28  single table T (
6680: 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d  as shown in exam
6690: 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68 65  ple B above) the
66a0: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76  n create a new v
66b0: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74  irtual.** term t
66c0: 68 61 74 20 69 73 20 61 6e 20 65 71 75 69 76 61  hat is an equiva
66d0: 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69  lent IN expressi
66e0: 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
66f0: 72 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d  rds, if the term
6700: 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  .** being analyz
6710: 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed is:.**.**    
6720: 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20    x = expr1  OR 
6730: 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20   expr2 = x  OR  
6740: 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20  x = expr3.**.** 
6750: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
6760: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c  w virtual term l
6770: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
6780: 20 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31       x IN (expr1
6790: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
67a0: 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a  .** CASE 2:.**.*
67b0: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
67c0: 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20  s are indexable 
67d0: 62 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  by a single tabl
67e0: 65 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  e T, then set.**
67f0: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
6800: 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20  m.eOperator     
6810: 20 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f           =  WO_O
6820: 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  R.**     WhereTe
6830: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  rm.u.pOrInfo->in
6840: 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65  dexable  |=  the
6850: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
6860: 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a  or table T.**.**
6870: 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 22 69   A subterm is "i
6880: 6e 64 65 78 61 62 6c 65 22 20 69 66 20 69 74 20  ndexable" if it 
6890: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  is of the form.*
68a0: 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70  * "T.C <op> <exp
68b0: 72 3e 22 20 77 68 65 72 65 20 43 20 69 73 20 61  r>" where C is a
68c0: 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ny column of tab
68d0: 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70  le T and .** <op
68e0: 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c  > is one of "=",
68f0: 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c   "<", "<=", ">",
6900: 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22   ">=", "IS NULL"
6910: 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20  , or "IN"..** A 
6920: 73 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20  subterm is also 
6930: 69 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74 20  indexable if it 
6940: 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f  is an AND of two
6950: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73   or more.** subs
6960: 75 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74  ubterms at least
6970: 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73   one of which is
6980: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64   indexable.  Ind
6990: 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73  exable AND .** s
69a0: 75 62 74 65 72 6d 73 20 68 61 76 65 20 74 68 65  ubterms have the
69b0: 69 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74  ir eOperator set
69c0: 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74   to WO_AND and t
69d0: 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41  hey have.** u.pA
69e0: 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20  ndInfo set to a 
69f0: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
6a00: 63 61 74 65 64 20 57 68 65 72 65 41 6e 64 54 65  cated WhereAndTe
6a10: 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  rm object..**.**
6a20: 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f   From another po
6a30: 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e  int of view, "in
6a40: 64 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74  dexable" means t
6a50: 68 61 74 20 74 68 65 20 73 75 62 74 65 72 6d 20  hat the subterm 
6a60: 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69  could.** potenti
6a70: 61 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  ally be used wit
6a80: 68 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e  h an index if an
6a90: 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
6aa0: 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68  ex exists..** Th
6ab0: 69 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73  is analysis does
6ac0: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68   not consider wh
6ad0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
6ae0: 20 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74   index exists; t
6af0: 68 61 74 0a 2a 2a 20 69 73 20 64 65 63 69 64 65  hat.** is decide
6b00: 64 20 65 6c 73 65 77 68 65 72 65 2e 20 20 54 68  d elsewhere.  Th
6b10: 69 73 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  is analysis only
6b20: 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65   looks at whethe
6b30: 72 20 73 75 62 74 65 72 6d 73 0a 2a 2a 20 61 70  r subterms.** ap
6b40: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
6b50: 64 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a  dexing exist..**
6b60: 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73  .** All examples
6b70: 20 41 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f   A through E abo
6b80: 76 65 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ve satisfy case 
6b90: 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65 72  2.  But if a ter
6ba0: 6d 0a 2a 2a 20 61 6c 73 6f 20 73 61 74 69 73 66  m.** also satisf
6bb0: 69 65 73 20 63 61 73 65 20 31 20 28 73 75 63 68  ies case 1 (such
6bc0: 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20 74   as B) we know t
6bd0: 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65  hat the optimize
6be0: 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73  r will.** always
6bf0: 20 70 72 65 66 65 72 20 63 61 73 65 20 31 2c 20   prefer case 1, 
6c00: 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
6c10: 77 65 20 70 72 65 74 65 6e 64 20 74 68 61 74 20  we pretend that 
6c20: 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a  case 2 is not.**
6c30: 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a   satisfied..**.*
6c40: 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20 74 68  * It might be th
6c50: 65 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c 74  e case that mult
6c60: 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65 20  iple tables are 
6c70: 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72 20  indexable.  For 
6c80: 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20  example,.** (E) 
6c90: 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61 62  above is indexab
6ca0: 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20  le on tables P, 
6cb0: 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20  Q, and R..**.** 
6cc0: 54 65 72 6d 73 20 74 68 61 74 20 73 61 74 69 73  Terms that satis
6cd0: 66 79 20 63 61 73 65 20 32 20 61 72 65 20 63 61  fy case 2 are ca
6ce0: 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f  ndidates for loo
6cf0: 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20  kup by using.** 
6d00: 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73  separate indices
6d10: 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73 20   to find rowids 
6d20: 66 6f 72 20 65 61 63 68 20 73 75 62 74 65 72 6d  for each subterm
6d30: 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a   and composing.*
6d40: 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61  * the union of a
6d50: 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67 20  ll rowids using 
6d60: 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e  a RowSet object.
6d70: 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61    This is simila
6d80: 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70 20  r.** to "bitmap 
6d90: 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68 65  indices" in othe
6da0: 72 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  r database engin
6db0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57  es..**.** OTHERW
6dc0: 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65  ISE:.**.** If ne
6dd0: 69 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f 72  ither case 1 nor
6de0: 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20 74   case 2 apply, t
6df0: 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65 4f  hen leave the eO
6e00: 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a  perator set to.*
6e10: 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74 65  * zero.  This te
6e20: 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c  rm is not useful
6e30: 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a   for search..*/.
6e40: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
6e50: 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20  AnalyzeOrTerm(. 
6e60: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
6e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
6e80: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
6e90: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
6ea0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC,         /* 
6eb0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48 45  the complete WHE
6ec0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
6ed0: 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20  nt idxTerm      
6ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
6ef0: 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72 6d  x of the OR-term
6f00: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
6f10: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
6f20: 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d  o *pWInfo = pWC-
6f30: 3e 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  >pWInfo;        
6f40: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
6f50: 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65  processing conte
6f60: 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  xt */.  Parse *p
6f70: 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
6f80: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
6f90: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
6fa0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
6fb0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6fd0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
6fe0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ction */.  Where
6ff0: 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  Term *pTerm = &p
7000: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20  WC->a[idxTerm]; 
7010: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74     /* The term t
7020: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
7030: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d  .  Expr *pExpr =
7040: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20   pTerm->pExpr;  
7050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7060: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
7070: 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  the term */.  in
7080: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
7090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70a0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
70b0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
70c0: 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20  eClause *pOrWc; 
70d0: 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75 70        /* Breakup
70e0: 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20 73   of pTerm into s
70f0: 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65  ubterms */.  Whe
7100: 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
7110: 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62 2d         /* A Sub-
7120: 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20  term within the 
7130: 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72 65  pOrWc */.  Where
7140: 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b  OrInfo *pOrInfo;
7150: 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e       /* Addition
7160: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  al information a
7170: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
7180: 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Term */.  Bitmas
7190: 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20  k chngToIN;     
71a0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68      /* Tables th
71b0: 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79  at might satisfy
71c0: 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69 74   case 1 */.  Bit
71d0: 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20  mask indexable; 
71e0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
71f0: 20 74 68 61 74 20 61 72 65 20 69 6e 64 65 78 61   that are indexa
7200: 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67 20  ble, satisfying 
7210: 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a  case 2 */..  /*.
7220: 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20 4f    ** Break the O
7230: 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69 74  R clause into it
7240: 73 20 73 65 70 61 72 61 74 65 20 73 75 62 74 65  s separate subte
7250: 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65 72  rms.  The subter
7260: 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72  ms are.  ** stor
7270: 65 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c 61  ed in a WhereCla
7280: 75 73 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  use structure co
7290: 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e 20  ntaining within 
72a0: 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a  the WhereOrInfo.
72b0: 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74    ** object that
72c0: 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20   is attached to 
72d0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20  the original OR 
72e0: 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a  clause term..  *
72f0: 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65  /.  assert( (pTe
7300: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
7310: 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d  ERM_DYNAMIC|TERM
7320: 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44  _ORINFO|TERM_AND
7330: 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61  INFO))==0 );.  a
7340: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
7350: 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65  ==TK_OR );.  pTe
7360: 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20  rm->u.pOrInfo = 
7370: 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  pOrInfo = sqlite
7380: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
7390: 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66  , sizeof(*pOrInf
73a0: 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e  o));.  if( pOrIn
73b0: 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  fo==0 ) return;.
73c0: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
73d0: 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b   |= TERM_ORINFO;
73e0: 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72 49  .  pOrWc = &pOrI
73f0: 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65  nfo->wc;.  where
7400: 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63  ClauseInit(pOrWc
7410: 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68 65  , pWInfo);.  whe
7420: 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20 70  reSplit(pOrWc, p
7430: 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20  Expr, TK_OR);.  
7440: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
7450: 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69  Src, pOrWc);.  i
7460: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
7470: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
7480: 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e  assert( pOrWc->n
7490: 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a  Term>=2 );..  /*
74a0: 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  ** Compute th
74b0: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
74c0: 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73  that might satis
74d0: 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32 2e  fy cases 1 or 2.
74e0: 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c  .  */.  indexabl
74f0: 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  e = ~(Bitmask)0;
7500: 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28  .  chngToIN = ~(
7510: 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
7520: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
7530: 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63  1, pOrTerm=pOrWc
7540: 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64  ->a; i>=0 && ind
7550: 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72  exable; i--, pOr
7560: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
7570: 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
7580: 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45  ator & WO_SINGLE
7590: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68  )==0 ){.      Wh
75a0: 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64  ereAndInfo *pAnd
75b0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65  Info;.      asse
75c0: 72 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74  rt( (pOrTerm->wt
75d0: 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e  Flags & (TERM_AN
75e0: 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46  DINFO|TERM_ORINF
75f0: 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  O))==0 );.      
7600: 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20  chngToIN = 0;.  
7610: 20 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73      pAndInfo = s
7620: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7630: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41  w(db, sizeof(*pA
7640: 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20  ndInfo));.      
7650: 69 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a  if( pAndInfo ){.
7660: 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61          WhereCla
7670: 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20  use *pAndWC;.   
7680: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
7690: 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20  pAndTerm;.      
76a0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
76b0: 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a   Bitmask b = 0;.
76c0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
76d0: 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41  >u.pAndInfo = pA
76e0: 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ndInfo;.        
76f0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
7700: 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f   |= TERM_ANDINFO
7710: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
7720: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
7730: 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70  O_AND;.        p
7740: 41 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66  AndWC = &pAndInf
7750: 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 77  o->wc;.        w
7760: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70  hereClauseInit(p
7770: 41 6e 64 57 43 2c 20 70 57 43 2d 3e 70 57 49 6e  AndWC, pWC->pWIn
7780: 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65  fo);.        whe
7790: 72 65 53 70 6c 69 74 28 70 41 6e 64 57 43 2c 20  reSplit(pAndWC, 
77a0: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  pOrTerm->pExpr, 
77b0: 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20 20  TK_AND);.       
77c0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
77d0: 70 53 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20  pSrc, pAndWC);. 
77e0: 20 20 20 20 20 20 20 70 41 6e 64 57 43 2d 3e 70         pAndWC->p
77f0: 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20  Outer = pWC;.   
7800: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64       testcase( d
7810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7820: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
7830: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7840: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
7850: 72 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d  r(j=0, pAndTerm=
7860: 70 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e  pAndWC->a; j<pAn
7870: 64 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  dWC->nTerm; j++,
7880: 20 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20   pAndTerm++){.  
7890: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
78a0: 28 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70  ( pAndTerm->pExp
78b0: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
78c0: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70   if( allowedOp(p
78d0: 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  AndTerm->pExpr->
78e0: 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  op) ){.         
78f0: 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73       b |= getMas
7900: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
7910: 53 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c  Set, pAndTerm->l
7920: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
7930: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7940: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7950: 20 20 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c          indexabl
7960: 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a  e &= b;.      }.
7970: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
7980: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
7990: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a   TERM_COPIED ){.
79a0: 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68        /* Skip th
79b0: 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e  is term for now.
79c0: 20 20 57 65 20 72 65 76 69 73 69 74 20 69 74 20    We revisit it 
79d0: 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20  when we process 
79e0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  the.      ** cor
79f0: 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f  responding TERM_
7a00: 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a  VIRTUAL term */.
7a10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7a20: 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20   Bitmask b;.    
7a30: 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 26 70    b = getMask(&p
7a40: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
7a50: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
7a60: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28  rsor);.      if(
7a70: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
7a80: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
7a90: 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
7aa0: 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20  eTerm *pOther = 
7ab0: 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72  &pOrWc->a[pOrTer
7ac0: 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
7ad0: 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73       b |= getMas
7ae0: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
7af0: 53 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66  Set, pOther->lef
7b00: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
7b10: 7d 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c  }.      indexabl
7b20: 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66  e &= b;.      if
7b30: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
7b40: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d  rator & WO_EQ)==
7b50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e  0 ){.        chn
7b60: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
7b70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7b80: 63 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20  chngToIN &= b;. 
7b90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7ba0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f  ..  /*.  ** Reco
7bb0: 72 64 20 74 68 65 20 73 65 74 20 6f 66 20 74 61  rd the set of ta
7bc0: 62 6c 65 73 20 74 68 61 74 20 73 61 74 69 73 66  bles that satisf
7bd0: 79 20 63 61 73 65 20 32 2e 20 20 54 68 65 20 73  y case 2.  The s
7be0: 65 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a  et might be.  **
7bf0: 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70   empty..  */.  p
7c00: 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
7c10: 65 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20  e = indexable;. 
7c20: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
7c30: 72 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30  r = indexable==0
7c40: 20 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20   ? 0 : WO_OR;.. 
7c50: 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49   /*.  ** chngToI
7c60: 4e 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66  N holds a set of
7c70: 20 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69   tables that *mi
7c80: 67 68 74 2a 20 73 61 74 69 73 66 79 20 63 61 73  ght* satisfy cas
7c90: 65 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77  e 1.  But.  ** w
7ca0: 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d  e have to do som
7cb0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65  e additional che
7cc0: 63 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20  cking to see if 
7cd0: 63 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20  case 1 really.  
7ce0: 2a 2a 20 69 73 20 73 61 74 69 73 66 69 65 64 2e  ** is satisfied.
7cf0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54  .  **.  ** chngT
7d00: 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69  oIN will hold ei
7d10: 74 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20  ther 0, 1, or 2 
7d20: 62 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74  bits.  The 0-bit
7d30: 20 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a   case means.  **
7d40: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
7d50: 6f 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66  o possibility of
7d60: 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68   transforming th
7d70: 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f  e OR clause into
7d80: 20 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72   an.  ** IN oper
7d90: 61 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65  ator because one
7da0: 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69   or more terms i
7db0: 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  n the OR clause 
7dc0: 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d  contain.  ** som
7dd0: 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
7de0: 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  n == on a column
7df0: 20 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74   in the single t
7e00: 61 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74  able.  The 1-bit
7e10: 0a 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73  .  ** case means
7e20: 20 74 68 61 74 20 65 76 65 72 79 20 74 65 72 6d   that every term
7e30: 20 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73   of the OR claus
7e40: 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  e is of the form
7e50: 0a 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c  .  ** "table.col
7e60: 75 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f  umn=expr" for so
7e70: 6d 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e  me single table.
7e80: 20 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68    The one bit th
7e90: 61 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77  at is set.  ** w
7ea0: 69 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  ill correspond t
7eb0: 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62  o the common tab
7ec0: 6c 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65  le.  We still ne
7ed0: 65 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d  ed to check to m
7ee0: 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68  ake.  ** sure th
7ef0: 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73  e same column is
7f00: 20 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72   used on all ter
7f10: 6d 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63  ms.  The 2-bit c
7f20: 61 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a  ase is when.  **
7f30: 20 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61   the all terms a
7f40: 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  re of the form "
7f50: 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61  table1.column=ta
7f60: 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49  ble2.column".  I
7f70: 74 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20  t.  ** might be 
7f80: 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d  possible to form
7f90: 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   an IN operator 
7fa0: 77 69 74 68 20 65 69 74 68 65 72 20 74 61 62 6c  with either tabl
7fb0: 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f  e1.column.  ** o
7fc0: 72 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20  r table2.column 
7fd0: 61 73 20 74 68 65 20 4c 48 53 20 69 66 20 65 69  as the LHS if ei
7fe0: 74 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  ther is common t
7ff0: 6f 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a  o every term of.
8000: 20 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75    ** the OR clau
8010: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  se..  **.  ** No
8020: 74 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66  te that terms of
8030: 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65   the form "table
8040: 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63  .column1=table.c
8050: 6f 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a  olumn2" (the.  *
8060: 2a 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20  * same table on 
8070: 62 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68  both sizes of th
8080: 65 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20  e ==) cannot be 
8090: 6f 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a  optimized..  */.
80a0: 20 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29    if( chngToIN )
80b0: 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68  {.    int okToCh
80c0: 6e 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20  ngToIN = 0;     
80d0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 63  /* True if the c
80e0: 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20  onversion to IN 
80f0: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20  is valid */.    
8100: 69 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31  int iColumn = -1
8110: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c  ;         /* Col
8120: 75 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73  umn index on lhs
8130: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
8140: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73  */.    int iCurs
8150: 6f 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  or = -1;        
8160: 20 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72   /* Table cursor
8170: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74   common to all t
8180: 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  erms */.    int 
8190: 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  j = 0;          
81a0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
81b0: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  unter */..    /*
81c0: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 61   Search for a ta
81d0: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74  ble and column t
81e0: 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f  hat appears on o
81f0: 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20  ne side or the. 
8200: 20 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74     ** other of t
8210: 68 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69  he == operator i
8220: 6e 20 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e  n every subterm.
8230: 20 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64    That table and
8240: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77   column.    ** w
8250: 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20  ill be recorded 
8260: 69 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69  in iCursor and i
8270: 43 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d  Column.  There m
8280: 69 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a  ight not be any.
8290: 20 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c      ** such tabl
82a0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53  e and column.  S
82b0: 65 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  et okToChngToIN 
82c0: 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  if an appropriat
82d0: 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61  e table.    ** a
82e0: 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75  nd column is fou
82f0: 6e 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54  nd but leave okT
8300: 6f 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20  oChngToIN false 
8310: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
8320: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30    */.    for(j=0
8330: 3b 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68  ; j<2 && !okToCh
8340: 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20  ngToIN; j++){.  
8350: 20 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f      pOrTerm = pO
8360: 72 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f  rWc->a;.      fo
8370: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
8380: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  -1; i>=0; i--, p
8390: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
83a0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
83b0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
83c0: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
83d0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
83e0: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
83f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
8400: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
8410: 72 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  r==iCursor ){.  
8420: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
8430: 69 73 20 74 68 65 20 32 2d 62 69 74 20 63 61 73  is the 2-bit cas
8440: 65 20 61 6e 64 20 77 65 20 61 72 65 20 6f 6e 20  e and we are on 
8450: 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61  the second itera
8460: 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
8470: 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 65     ** current te
8480: 72 6d 20 69 73 20 66 72 6f 6d 20 74 68 65 20 66  rm is from the f
8490: 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20  irst iteration. 
84a0: 20 53 6f 20 73 6b 69 70 20 74 68 69 73 20 74 65   So skip this te
84b0: 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  rm. */.         
84c0: 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b   assert( j==1 );
84d0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
84e0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
84f0: 20 20 20 20 20 20 20 69 66 28 20 28 63 68 6e 67         if( (chng
8500: 54 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b 28 26  ToIN & getMask(&
8510: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
8520: 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  , pOrTerm->leftC
8530: 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20 20  ursor))==0 ){.  
8540: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
8550: 74 65 72 6d 20 6d 75 73 74 20 62 65 20 6f 66 20  term must be of 
8560: 74 68 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d 74  the form t1.a==t
8570: 32 2e 62 20 77 68 65 72 65 20 74 32 20 69 73 20  2.b where t2 is 
8580: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
8590: 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65 74   ** chngToIN set
85a0: 20 62 75 74 20 74 31 20 69 73 20 6e 6f 74 2e 20   but t1 is not. 
85b0: 20 54 68 69 73 20 74 65 72 6d 20 77 69 6c 6c 20   This term will 
85c0: 62 65 20 65 69 74 68 65 72 20 70 72 65 63 65 64  be either preced
85d0: 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
85e0: 6f 72 20 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e  or follwed by an
85f0: 20 69 6e 76 65 72 74 65 64 20 63 6f 70 79 20 28   inverted copy (
8600: 74 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b  t2.b==t1.a).  Sk
8610: 69 70 20 74 68 69 73 20 74 65 72 6d 20 0a 20 20  ip this term .  
8620: 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 75          ** and u
8630: 73 65 20 69 74 73 20 69 6e 76 65 72 73 69 6f 6e  se its inversion
8640: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  . */.          t
8650: 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d  estcase( pOrTerm
8660: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
8670: 5f 43 4f 50 49 45 44 20 29 3b 0a 20 20 20 20 20  _COPIED );.     
8680: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
8690: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
86a0: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
86b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
86c0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  rt( pOrTerm->wtF
86d0: 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 50  lags & (TERM_COP
86e0: 49 45 44 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c  IED|TERM_VIRTUAL
86f0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ) );.          c
8700: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
8710: 20 7d 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75   }.        iColu
8720: 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e  mn = pOrTerm->u.
8730: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
8740: 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20 70 4f      iCursor = pO
8750: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
8760: 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  r;.        break
8770: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8780: 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20  if( i<0 ){.     
8790: 20 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61     /* No candida
87a0: 74 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20  te table+column 
87b0: 77 61 73 20 66 6f 75 6e 64 2e 20 20 54 68 69 73  was found.  This
87c0: 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a   can only occur.
87d0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68          ** on th
87e0: 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69  e second iterati
87f0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  on */.        as
8800: 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20  sert( j==1 );.  
8810: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73        assert( Is
8820: 50 6f 77 65 72 4f 66 54 77 6f 28 63 68 6e 67 54  PowerOfTwo(chngT
8830: 6f 49 4e 29 20 29 3b 0a 20 20 20 20 20 20 20 20  oIN) );.        
8840: 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e  assert( chngToIN
8850: 3d 3d 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  ==getMask(&pWInf
8860: 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75  o->sMaskSet, iCu
8870: 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20  rsor) );.       
8880: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
8890: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
88a0: 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f  j==1 );..      /
88b0: 2a 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20  * We have found 
88c0: 61 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c  a candidate tabl
88d0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43  e and column.  C
88e0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
88f0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  hat.      ** tab
8900: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73  le and column is
8910: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79   common to every
8920: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20   term in the OR 
8930: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
8940: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31  okToChngToIN = 1
8950: 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e  ;.      for(; i>
8960: 3d 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f  =0 && okToChngTo
8970: 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  IN; i--, pOrTerm
8980: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
8990: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
89a0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
89b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
89c0: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
89d0: 6f 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  or!=iCursor ){. 
89e0: 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d           pOrTerm
89f0: 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45  ->wtFlags &= ~TE
8a00: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
8a10: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
8a20: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
8a30: 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n!=iColumn ){.  
8a40: 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67          okToChng
8a50: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
8a60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8a70: 20 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20     int affLeft, 
8a80: 61 66 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20  affRight;.      
8a90: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69      /* If the ri
8aa0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
8ab0: 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20   also a column, 
8ac0: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
8ad0: 69 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ies.          **
8ae0: 20 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20 61   of both right a
8af0: 6e 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75  nd left sides mu
8b00: 73 74 20 62 65 20 73 75 63 68 20 74 68 61 74 20  st be such that 
8b10: 6e 6f 20 74 79 70 65 0a 20 20 20 20 20 20 20 20  no type.        
8b20: 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73    ** conversions
8b30: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e   are required on
8b40: 20 74 68 65 20 72 69 67 68 74 2e 20 20 28 54 69   the right.  (Ti
8b50: 63 6b 65 74 20 23 32 32 34 39 29 0a 20 20 20 20  cket #2249).    
8b60: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
8b70: 20 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71     affRight = sq
8b80: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
8b90: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
8ba0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
8bb0: 20 20 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73       affLeft = s
8bc0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
8bd0: 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  ty(pOrTerm->pExp
8be0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
8bf0: 20 20 20 20 20 69 66 28 20 61 66 66 52 69 67 68       if( affRigh
8c00: 74 21 3d 30 20 26 26 20 61 66 66 52 69 67 68 74  t!=0 && affRight
8c10: 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20  !=affLeft ){.   
8c20: 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e           okToChn
8c30: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
8c40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8c50: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
8c60: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
8c70: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
8c80: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
8c90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
8ca0: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
8cb0: 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  t, okToChngToIN 
8cc0: 69 73 20 74 72 75 65 20 69 66 20 6f 72 69 67 69  is true if origi
8cd0: 6e 61 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66  nal pTerm satisf
8ce0: 69 65 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  ies.    ** case 
8cf0: 31 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  1.  In that case
8d00: 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  , construct a ne
8d10: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74  w virtual term t
8d20: 68 61 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70  hat is .    ** p
8d30: 54 65 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69  Term converted i
8d40: 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74  nto an IN operat
8d50: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
8d60: 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  f( okToChngToIN 
8d70: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
8d80: 44 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Dup;            
8d90: 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64  /* A transient d
8da0: 75 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73  uplicate express
8db0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
8dc0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30  rList *pList = 0
8dd0: 3b 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f  ;   /* The RHS o
8de0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
8df0: 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
8e00: 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20  *pLeft = 0;     
8e10: 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20    /* The LHS of 
8e20: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
8e30: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
8e40: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
8e50: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
8e60: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a  IN operator */..
8e70: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57        for(i=pOrW
8e80: 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  c->nTerm-1, pOrT
8e90: 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e  erm=pOrWc->a; i>
8ea0: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
8eb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
8ec0: 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61   (pOrTerm->wtFla
8ed0: 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29  gs & TERM_OR_OK)
8ee0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
8ef0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8f00: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
8f10: 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
8f20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
8f30: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
8f40: 72 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20  r==iCursor );.  
8f50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
8f60: 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  rTerm->u.leftCol
8f70: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a  umn==iColumn );.
8f80: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
8f90: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
8fa0: 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  , pOrTerm->pExpr
8fb0: 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
8fc0: 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71        pList = sq
8fd0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
8fe0: 65 6e 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  end(pWInfo->pPar
8ff0: 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 29  se, pList, pDup)
9000: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20  ;.        pLeft 
9010: 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  = pOrTerm->pExpr
9020: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d  ->pLeft;.      }
9030: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9040: 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Left!=0 );.     
9050: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
9060: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
9070: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
9080: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
9090: 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70  pParse, TK_IN, p
90a0: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
90b0: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
90c0: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
90d0: 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73 66  ;.        transf
90e0: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
90f0: 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
9100: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
9110: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
9120: 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  ew, EP_xIsSelect
9130: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
9140: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
9150: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e  st;.        idxN
9160: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
9170: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
9180: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
9190: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
91a0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
91b0: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
91c0: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
91d0: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
91e0: 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  ew);.        pTe
91f0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
9200: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70  Term];.        p
9210: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50  WC->a[idxNew].iP
9220: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
9230: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
9240: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
9250: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9260: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9270: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
9280: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9290: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
92a0: 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a  r = WO_NOOP;  /*
92b0: 20 63 61 73 65 20 31 20 74 72 75 6d 70 73 20 63   case 1 trumps c
92c0: 61 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d 0a 20  ase 2 */.    }. 
92d0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
92e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
92f0: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26 20 21  PTIMIZATION && !
9300: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
9310: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  UERY */../*.** T
9320: 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73  he input to this
9330: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 57   routine is an W
9340: 68 65 72 65 54 65 72 6d 20 73 74 72 75 63 74 75  hereTerm structu
9350: 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74 68 65  re with only the
9360: 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69 65 6c  .** "pExpr" fiel
9370: 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68  d filled in.  Th
9380: 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
9390: 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c  utine is to anal
93a0: 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62 65 78  yze the.** subex
93b0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70  pression and pop
93c0: 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20 6f 74  ulate all the ot
93d0: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 74 68  her fields of th
93e0: 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73  e WhereTerm.** s
93f0: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
9400: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9410: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
9420: 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22   "<expr> <op> X"
9430: 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75 74 65   it gets commute
9440: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 6e  d.** to the stan
9450: 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22 58 20  dard form of "X 
9460: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a  <op> <expr>"..**
9470: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
9480: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
9490: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20  form "X <op> Y" 
94a0: 77 68 65 72 65 20 62 6f 74 68 20 58 20 61 6e 64  where both X and
94b0: 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e   Y are.** column
94c0: 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  s, then the orig
94d0: 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20  inal expression 
94e0: 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
94f0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a   a new virtual.*
9500: 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  * term of the fo
9510: 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22 20 69 73  rm "Y <op> X" is
9520: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 57 48   added to the WH
9530: 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a  ERE clause and.*
9540: 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65 70 61 72  * analyzed separ
9550: 61 74 65 6c 79 2e 20 20 54 68 65 20 6f 72 69 67  ately.  The orig
9560: 69 6e 61 6c 20 74 65 72 6d 20 69 73 20 6d 61 72  inal term is mar
9570: 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 43 4f  ked with TERM_CO
9580: 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74 68 65 20  PIED.** and the 
9590: 6e 65 77 20 74 65 72 6d 20 69 73 20 6d 61 72 6b  new term is mark
95a0: 65 64 20 77 69 74 68 20 54 45 52 4d 5f 44 59 4e  ed with TERM_DYN
95b0: 41 4d 49 43 20 28 62 65 63 61 75 73 65 20 69 74  AMIC (because it
95c0: 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e 65 65 64  's pExpr.** need
95d0: 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 69  s to be freed wi
95e0: 74 68 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  th the WhereClau
95f0: 73 65 29 20 61 6e 64 20 54 45 52 4d 5f 56 49 52  se) and TERM_VIR
9600: 54 55 41 4c 20 28 62 65 63 61 75 73 65 20 69 74  TUAL (because it
9610: 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d 75 74 65  .** is a commute
9620: 64 20 63 6f 70 79 20 6f 66 20 61 20 70 72 69 6f  d copy of a prio
9630: 72 20 74 65 72 6d 2e 29 20 20 54 68 65 20 6f 72  r term.)  The or
9640: 69 67 69 6e 61 6c 20 74 65 72 6d 20 68 61 73 20  iginal term has 
9650: 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20  nChild=1.** and 
9660: 74 68 65 20 63 6f 70 79 20 68 61 73 20 69 64 78  the copy has idx
9670: 50 61 72 65 6e 74 20 73 65 74 20 74 6f 20 74 68  Parent set to th
9680: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6f  e index of the o
9690: 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f  riginal term..*/
96a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
96b0: 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c  rAnalyze(.  SrcL
96c0: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
96d0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
96e0: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
96f0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
9700: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
9710: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
9720: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20   int idxTerm    
9730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9740: 64 65 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20  dex of the term 
9750: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
9760: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
9770: 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e   *pWInfo = pWC->
9780: 70 57 49 6e 66 6f 3b 20 2f 2a 20 57 48 45 52 45  pWInfo; /* WHERE
9790: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
97a0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
97b0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
97c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
97d0: 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20   /* The term to 
97e0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  be analyzed */. 
97f0: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
9800: 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20 20  MaskSet;        
9810: 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61 62 6c    /* Set of tabl
9820: 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f  e index masks */
9830: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20  .  Expr *pExpr; 
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9850: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
9860: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c  ssion to be anal
9870: 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73  yzed */.  Bitmas
9880: 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20 20 20  k prereqLeft;   
9890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
98a0: 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 74  erequesites of t
98b0: 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  he pExpr->pLeft 
98c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
98d0: 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  reqAll;         
98e0: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75        /* Prerequ
98f0: 65 73 69 74 65 73 20 6f 66 20 70 45 78 70 72 20  esites of pExpr 
9900: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74  */.  Bitmask ext
9910: 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20 20 20  raRight = 0;    
9920: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 64        /* Extra d
9930: 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 4c  ependencies on L
9940: 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78  EFT JOIN */.  Ex
9950: 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b 20 20  pr *pStr1 = 0;  
9960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9970: 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c  * RHS of LIKE/GL
9980: 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  OB operator */. 
9990: 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 20   int isComplete 
99a0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
99b0: 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45    /* RHS of LIKE
99c0: 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74 68 20  /GLOB ends with 
99d0: 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 69 6e  wildcard */.  in
99e0: 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20 20 20  t noCase = 0;   
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9a00: 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69 73 74  * LIKE/GLOB dist
9a10: 69 6e 67 75 69 73 68 65 73 20 63 61 73 65 20 2a  inguishes case *
9a20: 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a40: 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65       /* Top-leve
9a50: 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78  l operator.  pEx
9a60: 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73  pr->op */.  Pars
9a70: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
9a80: 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 2f 2a 20  fo->pParse;  /* 
9a90: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
9aa0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
9ab0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
9ac0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
9ad0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
9ae0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
9af0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
9b00: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65  eturn;.  }.  pTe
9b10: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
9b20: 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65  Term];.  pMaskSe
9b30: 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  t = &pWInfo->sMa
9b40: 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d  skSet;.  pExpr =
9b50: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
9b60: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
9b70: 6f 70 21 3d 54 4b 5f 41 53 20 26 26 20 70 45 78  op!=TK_AS && pEx
9b80: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41  pr->op!=TK_COLLA
9b90: 54 45 20 29 3b 0a 20 20 70 72 65 72 65 71 4c 65  TE );.  prereqLe
9ba0: 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ft = exprTableUs
9bb0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
9bc0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f  xpr->pLeft);.  o
9bd0: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
9be0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29   if( op==TK_IN )
9bf0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
9c00: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
9c10: 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
9c20: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
9c30: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
9c40: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
9c50: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
9c60: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
9c70: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
9c80: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  r->x.pSelect);. 
9c90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9ca0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
9cb0: 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62  ht = exprListTab
9cc0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
9cd0: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
9ce0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
9cf0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55   if( op==TK_ISNU
9d00: 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  LL ){.    pTerm-
9d10: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
9d20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
9d30: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
9d40: 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  t = exprTableUsa
9d50: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
9d60: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d  pr->pRight);.  }
9d70: 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65  .  prereqAll = e
9d80: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
9d90: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a  askSet, pExpr);.
9da0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
9db0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
9dc0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
9dd0: 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74   Bitmask x = get
9de0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
9df0: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
9e00: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72  Table);.    prer
9e10: 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20  eqAll |= x;.    
9e20: 65 78 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31  extraRight = x-1
9e30: 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20  ;  /* ON clause 
9e40: 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65  terms may not be
9e50: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
9e60: 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20  dex.            
9e70: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
9e80: 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61   left table of a
9e90: 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63   LEFT JOIN.  Tic
9ea0: 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d  ket #3015 */.  }
9eb0: 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  .  pTerm->prereq
9ec0: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
9ed0: 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  .  pTerm->leftCu
9ee0: 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rsor = -1;.  pTe
9ef0: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31  rm->iParent = -1
9f00: 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  ;.  pTerm->eOper
9f10: 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ator = 0;.  if( 
9f20: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b  allowedOp(op) ){
9f30: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
9f40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
9f50: 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d  ipCollate(pExpr-
9f60: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 45 78 70  >pLeft);.    Exp
9f70: 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r *pRight = sqli
9f80: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
9f90: 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  te(pExpr->pRight
9fa0: 29 3b 0a 20 20 20 20 75 31 36 20 6f 70 4d 61 73  );.    u16 opMas
9fb0: 6b 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  k = (pTerm->prer
9fc0: 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71  eqRight & prereq
9fd0: 4c 65 66 74 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c  Left)==0 ? WO_AL
9fe0: 4c 20 3a 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20  L : WO_EQUIV;.  
9ff0: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
a000: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
a010: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
a020: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
a030: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65  Table;.      pTe
a040: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
a050: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
a060: 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  n;.      pTerm->
a070: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  eOperator = oper
a080: 61 74 6f 72 4d 61 73 6b 28 6f 70 29 20 26 20 6f  atorMask(op) & o
a090: 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  pMask;.    }.   
a0a0: 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70   if( pRight && p
a0b0: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  Right->op==TK_CO
a0c0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68  LUMN ){.      Wh
a0d0: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20  ereTerm *pNew;. 
a0e0: 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b       Expr *pDup;
a0f0: 0a 20 20 20 20 20 20 75 31 36 20 65 45 78 74 72  .      u16 eExtr
a100: 61 4f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  aOp = 0;        
a110: 2f 2a 20 45 78 74 72 61 20 62 69 74 73 20 66 6f  /* Extra bits fo
a120: 72 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f  r pNew->eOperato
a130: 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  r */.      if( p
a140: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
a150: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=0 ){.        i
a160: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
a170: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
a180: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
a190: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
a1a0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
a1b0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
a1c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
a1d0: 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20  ete(db, pDup);. 
a1e0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
a1f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a200: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
a210: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
a220: 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49  C, pDup, TERM_VI
a230: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
a240: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IC);.        if(
a250: 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74   idxNew==0 ) ret
a260: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  urn;.        pNe
a270: 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  w = &pWC->a[idxN
a280: 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ew];.        pNe
a290: 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w->iParent = idx
a2a0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
a2b0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
a2c0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20  xTerm];.        
a2d0: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
a2e0: 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  1;.        pTerm
a2f0: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
a300: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
a310: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
a320: 3d 54 4b 5f 45 51 0a 20 20 20 20 20 20 20 20 20  =TK_EQ.         
a330: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
a340: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
a350: 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20  omJoin).        
a360: 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
a370: 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
a380: 54 45 5f 54 72 61 6e 73 69 74 69 76 65 29 0a 20  TE_Transitive). 
a390: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
a3a0: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
a3b0: 61 74 6f 72 20 7c 3d 20 57 4f 5f 45 51 55 49 56  ator |= WO_EQUIV
a3c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 45 78 74  ;.          eExt
a3d0: 72 61 4f 70 20 3d 20 57 4f 5f 45 51 55 49 56 3b  raOp = WO_EQUIV;
a3e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a3f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a400: 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20  pDup = pExpr;.  
a410: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65        pNew = pTe
a420: 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
a430: 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50    exprCommute(pP
a440: 61 72 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20  arse, pDup);.   
a450: 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
a460: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
a470: 65 28 70 44 75 70 2d 3e 70 4c 65 66 74 29 3b 0a  e(pDup->pLeft);.
a480: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74        pNew->left
a490: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
a4a0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
a4b0: 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  ew->u.leftColumn
a4c0: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
a4d0: 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  n;.      testcas
a4e0: 65 28 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c  e( (prereqLeft |
a4f0: 20 65 78 74 72 61 52 69 67 68 74 29 20 21 3d 20   extraRight) != 
a500: 70 72 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20  prereqLeft );.  
a510: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
a520: 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65  Right = prereqLe
a530: 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b  ft | extraRight;
a540: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
a550: 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41  reqAll = prereqA
a560: 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ll;.      pNew->
a570: 65 4f 70 65 72 61 74 6f 72 20 3d 20 28 6f 70 65  eOperator = (ope
a580: 72 61 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e  ratorMask(pDup->
a590: 6f 70 29 20 2b 20 65 45 78 74 72 61 4f 70 29 20  op) + eExtraOp) 
a5a0: 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  & opMask;.    }.
a5b0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
a5c0: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
a5d0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
a5e0: 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20  /* If a term is 
a5f0: 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72  the BETWEEN oper
a600: 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f  ator, create two
a610: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
a620: 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66  ms.  ** that def
a630: 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68  ine the range th
a640: 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  at the BETWEEN i
a650: 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20  mplements.  For 
a660: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
a670: 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57 45 45  **      a BETWEE
a680: 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20  N b AND c.  **. 
a690: 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64   ** is converted
a6a0: 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
a6b0: 20 20 20 20 20 20 28 61 20 42 45 54 57 45 45 4e        (a BETWEEN
a6c0: 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61   b AND c) AND (a
a6d0: 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a  >=b) AND (a<=c).
a6e0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77    **.  ** The tw
a6f0: 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  o new terms are 
a700: 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  added onto the e
a710: 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72 65 43  nd of the WhereC
a720: 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20  lause object..  
a730: 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73  ** The new terms
a740: 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61   are "dynamic" a
a750: 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20  nd are children 
a760: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
a770: 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72  BETWEEN.  ** ter
a780: 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74  m.  That means t
a790: 68 61 74 20 69 66 20 74 68 65 20 42 45 54 57 45  hat if the BETWE
a7a0: 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64  EN term is coded
a7b0: 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61  , the children a
a7c0: 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e  re.  ** skipped.
a7d0: 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69    Or, if the chi
a7e0: 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69 73 66  ldren are satisf
a7f0: 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c  ied by an index,
a800: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
a810: 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  ** BETWEEN term 
a820: 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  is skipped..  */
a830: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
a840: 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45  r->op==TK_BETWEE
a850: 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  N && pWC->op==TK
a860: 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72  _AND ){.    Expr
a870: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
a880: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
a890: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61    int i;.    sta
a8a0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73  tic const u8 ops
a8b0: 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f  [] = {TK_GE, TK_
a8c0: 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  LE};.    assert(
a8d0: 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20   pList!=0 );.   
a8e0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
a8f0: 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20  nExpr==2 );.    
a900: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
a910: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
a920: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
a930: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
a940: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
a950: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
a960: 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20  , ops[i], .     
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a980: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
a990: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
a9a0: 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20  ->pLeft, 0),.   
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a9d0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69  3ExprDup(db, pLi
a9e0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
a9f0: 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 74 72  0), 0);.      tr
aa00: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e  ansferJoinMarkin
aa10: 67 73 28 70 4e 65 77 45 78 70 72 2c 20 70 45 78  gs(pNewExpr, pEx
aa20: 70 72 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65  pr);.      idxNe
aa30: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
aa40: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
aa50: 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  xpr, TERM_VIRTUA
aa60: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
aa70: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
aa80: 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20   idxNew==0 );.  
aa90: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
aaa0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
aab0: 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  w);.      pTerm 
aac0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
aad0: 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  m];.      pWC->a
aae0: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
aaf0: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
ab00: 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68  }.    pTerm->nCh
ab10: 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e  ild = 2;.  }.#en
ab20: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
ab30: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
ab40: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20  IZATION */..#if 
ab50: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
ab60: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
ab70: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
ab80: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
ab90: 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61  BQUERY).  /* Ana
aba0: 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74  lyze a term that
abb0: 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20   is composed of 
abc0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74  two or more subt
abd0: 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
abe0: 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65  y.  ** an OR ope
abf0: 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c  rator..  */.  el
ac00: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
ac10: 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61  ==TK_OR ){.    a
ac20: 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d  ssert( pWC->op==
ac30: 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78  TK_AND );.    ex
ac40: 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28  prAnalyzeOrTerm(
ac50: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65  pSrc, pWC, idxTe
ac60: 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  rm);.    pTerm =
ac70: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
ac80: 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ];.  }.#endif /*
ac90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
aca0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
acb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
acc0: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
acd0: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20  ZATION.  /* Add 
ace0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72  constraints to r
acf0: 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68  educe the search
ad00: 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45   space on a LIKE
ad10: 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70   or GLOB.  ** op
ad20: 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  erator..  **.  *
ad30: 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e  * A like pattern
ad40: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20   of the form "x 
ad50: 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69 73 20  LIKE 'abc%'" is 
ad60: 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e  changed into con
ad70: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20  straints.  **.  
ad80: 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27  **          x>='
ad90: 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27  abc' AND x<'abd'
ada0: 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63   AND x LIKE 'abc
adb0: 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  %'.  **.  ** The
adc0: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
add0: 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 22 61  of the prefix "a
ade0: 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  bc" is increment
adf0: 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20  ed to form the. 
ae00: 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20   ** termination 
ae10: 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e  condition "abd".
ae20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d  .  */.  if( pWC-
ae30: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20  >op==TK_AND .   
ae40: 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  && isLikeOrGlob(
ae50: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
ae60: 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65  pStr1, &isComple
ae70: 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 29  te, &noCase).  )
ae80: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  {.    Expr *pLef
ae90: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20  t;       /* LHS 
aea0: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65  of LIKE/GLOB ope
aeb0: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70  rator */.    Exp
aec0: 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20 20 20  r *pStr2;       
aed0: 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74 72 31  /* Copy of pStr1
aee0: 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47   - RHS of LIKE/G
aef0: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  LOB operator */.
af00: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
af10: 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  pr1;.    Expr *p
af20: 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e  NewExpr2;.    in
af30: 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20 20 69  t idxNew1;.    i
af40: 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20 20 20  nt idxNew2;.    
af50: 54 6f 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e 61  Token sCollSeqNa
af60: 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me;  /* Name of 
af70: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
af80: 63 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74  ce */..    pLeft
af90: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
afa0: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
afb0: 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74     pStr2 = sqlit
afc0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
afd0: 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tr1, 0);.    if(
afe0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
aff0: 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63  ed ){.      u8 c
b000: 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20  , *pC;       /* 
b010: 4c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62  Last character b
b020: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
b030: 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20  wildcard */.    
b040: 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74    pC = (u8*)&pSt
b050: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c  r2->u.zToken[sql
b060: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74  ite3Strlen30(pSt
b070: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d  r2->u.zToken)-1]
b080: 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b  ;.      c = *pC;
b090: 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73  .      if( noCas
b0a0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
b0b0: 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20  The point is to 
b0c0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61  increment the la
b0d0: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
b0e0: 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20 20  ore the first.  
b0f0: 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72        ** wildcar
b100: 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 69 6e  d.  But if we in
b110: 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61  crement '@', tha
b120: 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69  t will push it i
b130: 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
b140: 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72 61  ** alphabetic ra
b150: 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 20 63  nge where case c
b160: 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20  onversions will 
b170: 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 20 20  mess up the .   
b180: 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69       ** inequali
b190: 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68  ty.  To avoid th
b1a0: 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f  is, make sure to
b1b0: 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75   also run the fu
b1c0: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49  ll.        ** LI
b1d0: 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64  KE on all candid
b1e0: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ate expressions 
b1f0: 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  by clearing the 
b200: 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a  isComplete flag.
b210: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
b220: 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20     if( c=='A'-1 
b230: 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30  ) isComplete = 0
b240: 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71  ;.        c = sq
b250: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
b260: 72 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r[c];.      }.  
b270: 20 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b      *pC = c + 1;
b280: 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 6f 6c 6c  .    }.    sColl
b290: 53 65 71 4e 61 6d 65 2e 7a 20 3d 20 6e 6f 43 61  SeqName.z = noCa
b2a0: 73 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20  se ? "NOCASE" : 
b2b0: 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 73 43  "BINARY";.    sC
b2c0: 6f 6c 6c 53 65 71 4e 61 6d 65 2e 6e 20 3d 20 36  ollSeqName.n = 6
b2d0: 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20  ;.    pNewExpr1 
b2e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
b2f0: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a  (db, pLeft, 0);.
b300: 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20      pNewExpr1 = 
b310: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
b320: 72 73 65 2c 20 54 4b 5f 47 45 2c 20 0a 20 20 20  rse, TK_GE, .   
b330: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b340: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
b350: 65 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78  en(pParse,pNewEx
b360: 70 72 31 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d  pr1,&sCollSeqNam
b370: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  e),.           p
b380: 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 74 72  Str1, 0);.    tr
b390: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e  ansferJoinMarkin
b3a0: 67 73 28 70 4e 65 77 45 78 70 72 31 2c 20 70 45  gs(pNewExpr1, pE
b3b0: 78 70 72 29 3b 0a 20 20 20 20 69 64 78 4e 65 77  xpr);.    idxNew
b3c0: 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  1 = whereClauseI
b3d0: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
b3e0: 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55  xpr1, TERM_VIRTU
b3f0: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
b400: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
b410: 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20  idxNew1==0 );.  
b420: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
b430: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31  rc, pWC, idxNew1
b440: 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32  );.    pNewExpr2
b450: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b460: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
b470: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d  .    pNewExpr2 =
b480: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
b490: 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20  arse, TK_LT,.   
b4a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b4b0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
b4c0: 65 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78  en(pParse,pNewEx
b4d0: 70 72 32 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d  pr2,&sCollSeqNam
b4e0: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  e),.           p
b4f0: 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 74 72  Str2, 0);.    tr
b500: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e  ansferJoinMarkin
b510: 67 73 28 70 4e 65 77 45 78 70 72 32 2c 20 70 45  gs(pNewExpr2, pE
b520: 78 70 72 29 3b 0a 20 20 20 20 69 64 78 4e 65 77  xpr);.    idxNew
b530: 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  2 = whereClauseI
b540: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
b550: 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55  xpr2, TERM_VIRTU
b560: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
b570: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
b580: 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20  idxNew2==0 );.  
b590: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
b5a0: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 32  rc, pWC, idxNew2
b5b0: 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  );.    pTerm = &
b5c0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
b5d0: 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c  .    if( isCompl
b5e0: 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70 57 43  ete ){.      pWC
b5f0: 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61  ->a[idxNew1].iPa
b600: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
b610: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
b620: 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20  New2].iParent = 
b630: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
b640: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32  Term->nChild = 2
b650: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
b660: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
b670: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
b680: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ION */..#ifndef 
b690: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
b6a0: 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64  UALTABLE.  /* Ad
b6b0: 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61 75 78  d a WO_MATCH aux
b6c0: 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f 20 74  iliary term to t
b6d0: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 65  he constraint se
b6e0: 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75  t if the.  ** cu
b6f0: 72 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  rrent expression
b700: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
b710: 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65    column MATCH e
b720: 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69  xpr..  ** This i
b730: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
b740: 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
b750: 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a  ndex methods of.
b760: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62    ** virtual tab
b770: 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69 76 65  les.  The native
b780: 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72   query optimizer
b790: 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d 70   does not attemp
b7a0: 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79  t.  ** to do any
b7b0: 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54 43 48  thing with MATCH
b7c0: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
b7d0: 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68 4f 66  .  if( isMatchOf
b7e0: 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20 29 7b  Column(pExpr) ){
b7f0: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b  .    int idxNew;
b800: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
b810: 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57  t, *pLeft;.    W
b820: 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65  hereTerm *pNewTe
b830: 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20  rm;.    Bitmask 
b840: 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72  prereqColumn, pr
b850: 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20 20 70  ereqExpr;..    p
b860: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
b870: 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
b880: 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20  pr;.    pLeft = 
b890: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
b8a0: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
b8b0: 70 72 65 72 65 71 45 78 70 72 20 3d 20 65 78 70  prereqExpr = exp
b8c0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
b8d0: 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  kSet, pRight);. 
b8e0: 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20     prereqColumn 
b8f0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
b900: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74  (pMaskSet, pLeft
b910: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72  );.    if( (prer
b920: 65 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43  eqExpr & prereqC
b930: 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  olumn)==0 ){.   
b940: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
b950: 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70  r;.      pNewExp
b960: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
b970: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43  (pParse, TK_MATC
b980: 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  H, .            
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9a0: 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72    0, sqlite3Expr
b9b0: 44 75 70 28 64 62 2c 20 70 52 69 67 68 74 2c 20  Dup(db, pRight, 
b9c0: 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  0), 0);.      id
b9d0: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
b9e0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
b9f0: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
ba00: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
ba10: 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  C);.      testca
ba20: 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b  se( idxNew==0 );
ba30: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20  .      pNewTerm 
ba40: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
ba50: 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ];.      pNewTer
ba60: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
ba70: 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20 20 20   prereqExpr;.   
ba80: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66     pNewTerm->lef
ba90: 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d  tCursor = pLeft-
baa0: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
bab0: 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  NewTerm->u.leftC
bac0: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
bad0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e  Column;.      pN
bae0: 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  ewTerm->eOperato
baf0: 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20  r = WO_MATCH;.  
bb00: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50      pNewTerm->iP
bb10: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
bb20: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
bb30: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
bb40: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
bb50: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
bb60: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
bb70: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
bb80: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
bb90: 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d  rereqAll = pTerm
bba0: 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  ->prereqAll;.   
bbb0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
bbc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
bbd0: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
bbe0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
bbf0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
bc00: 34 0a 20 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69  4.  /* When sqli
bc10: 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72  te_stat3 histogr
bc20: 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  am data is avail
bc30: 61 62 6c 65 20 61 6e 20 6f 70 65 72 61 74 6f 72  able an operator
bc40: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72   of the.  ** for
bc50: 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  m "x IS NOT NULL
bc60: 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20  " can sometimes 
bc70: 62 65 20 65 76 61 6c 75 61 74 65 64 20 6d 6f 72  be evaluated mor
bc80: 65 20 65 66 66 69 63 69 65 6e 74 6c 79 0a 20 20  e efficiently.  
bc90: 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69  ** as "x>NULL" i
bca0: 66 20 78 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  f x is not an IN
bcb0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
bcc0: 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72 75 63 74  Y.  So construct
bcd0: 20 61 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20   a.  ** virtual 
bce0: 74 65 72 6d 20 6f 66 20 74 68 61 74 20 66 6f 72  term of that for
bcf0: 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  m..  **.  ** Not
bd00: 65 20 74 68 61 74 20 74 68 65 20 76 69 72 74 75  e that the virtu
bd10: 61 6c 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  al term must be 
bd20: 74 61 67 67 65 64 20 77 69 74 68 20 54 45 52 4d  tagged with TERM
bd30: 5f 56 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 20 20  _VNULL.  This.  
bd40: 2a 2a 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 74 61  ** TERM_VNULL ta
bd50: 67 20 77 69 6c 6c 20 73 75 70 70 72 65 73 73 20  g will suppress 
bd60: 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65  the not-null che
bd70: 63 6b 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ck at the beginn
bd80: 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ing.  ** of the 
bd90: 6c 6f 6f 70 2e 20 20 57 69 74 68 6f 75 74 20 74  loop.  Without t
bda0: 68 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c  he TERM_VNULL fl
bdb0: 61 67 2c 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c  ag, the not-null
bdc0: 20 63 68 65 63 6b 20 61 74 0a 20 20 2a 2a 20 74   check at.  ** t
bdd0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
bde0: 6c 6f 6f 70 20 77 69 6c 6c 20 70 72 65 76 65 6e  loop will preven
bdf0: 74 20 61 6e 79 20 72 65 73 75 6c 74 73 20 66 72  t any results fr
be00: 6f 6d 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65  om being returne
be10: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45  d..  */.  if( pE
be20: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  xpr->op==TK_NOTN
be30: 55 4c 4c 0a 20 20 20 26 26 20 70 45 78 70 72 2d  ULL.   && pExpr-
be40: 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  >pLeft->op==TK_C
be50: 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70  OLUMN.   && pExp
be60: 72 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  r->pLeft->iColum
be70: 6e 3e 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d  n>=0.   && Optim
be80: 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
be90: 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29  b, SQLITE_Stat3)
bea0: 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  .  ){.    Expr *
beb0: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78  pNewExpr;.    Ex
bec0: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
bed0: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e  r->pLeft;.    in
bee0: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 57 68  t idxNew;.    Wh
bef0: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72  ereTerm *pNewTer
bf00: 6d 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78 70 72  m;..    pNewExpr
bf10: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
bf20: 70 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20  pParse, TK_GT,. 
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf40: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
bf50: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
bf60: 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  eft, 0),.       
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf80: 20 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70       sqlite3PExp
bf90: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c  r(pParse, TK_NUL
bfa0: 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b  L, 0, 0, 0), 0);
bfb0: 0a 0a 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77  ..    idxNew = w
bfc0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
bfd0: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a  (pWC, pNewExpr,.
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 45                TE
c000: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
c010: 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55  DYNAMIC|TERM_VNU
c020: 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 69 64 78  LL);.    if( idx
c030: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
c040: 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  wTerm = &pWC->a[
c050: 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70  idxNew];.      p
c060: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  NewTerm->prereqR
c070: 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ight = 0;.      
c080: 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pNewTerm->leftCu
c090: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
c0a0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
c0b0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
c0c0: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
c0d0: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  umn;.      pNewT
c0e0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
c0f0: 20 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e   WO_GT;.      pN
c100: 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20  ewTerm->iParent 
c110: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
c120: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
c130: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
c140: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
c150: 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   1;.      pTerm-
c160: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
c170: 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70  _COPIED;.      p
c180: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  NewTerm->prereqA
c190: 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  ll = pTerm->prer
c1a0: 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  eqAll;.    }.  }
c1b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
c1c0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
c1d0: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 20 20 2f 2a  R_STAT4 */..  /*
c1e0: 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75   Prevent ON clau
c1f0: 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45  se terms of a LE
c200: 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69  FT JOIN from bei
c210: 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69 76 65  ng used to drive
c220: 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66  .  ** an index f
c230: 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  or tables to the
c240: 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69   left of the joi
c250: 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d  n..  */.  pTerm-
c260: 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20  >prereqRight |= 
c270: 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f  extraRight;.}../
c280: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
c290: 6f 6e 20 73 65 61 72 63 68 65 73 20 70 4c 69 73  on searches pLis
c2a0: 74 20 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 74  t for an entry t
c2b0: 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20  hat matches the 
c2c0: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a  iCol-th column.*
c2d0: 2a 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e  * of index pIdx.
c2e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61  .**.** If such a
c2f0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
c300: 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78  found, its index
c310: 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69   in pList->a[] i
c320: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a  s returned. If.*
c330: 2a 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20  * no expression 
c340: 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20  is found, -1 is 
c350: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
c360: 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65  tic int findInde
c370: 78 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70  xCol(.  Parse *p
c380: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
c390: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
c3a0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
c3b0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c3d0: 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   Expression list
c3e0: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
c3f0: 69 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20 20  int iBase,      
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c410: 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61  /* Cursor for ta
c420: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
c430: 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e  ith pIdx */.  In
c440: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c460: 20 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20   Index to match 
c470: 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69  column of */.  i
c480: 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20  nt iCol         
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c4a0: 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  * Column of inde
c4b0: 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b  x to match */.){
c4c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
c4d0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
c4e0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f  pIdx->azColl[iCo
c4f0: 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  l];..  for(i=0; 
c500: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
c510: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
c520: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
c530: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74  kipCollate(pList
c540: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
c550: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
c560: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20  _COLUMN.     && 
c570: 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78  p->iColumn==pIdx
c580: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d  ->aiColumn[iCol]
c590: 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62  .     && p->iTab
c5a0: 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b  le==iBase.    ){
c5b0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
c5c0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
c5d0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
c5e0: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e, pList->a[i].p
c5f0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
c600: 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 26   ALWAYS(pColl) &
c610: 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
c620: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
c630: 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
c640: 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20      return i;.  
c650: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c660: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
c670: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
c680: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
c690: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  CT expression-li
c6a0: 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
c6b0: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a   third argument.
c6c0: 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  ** is redundant.
c6d0: 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e 43  .**.** A DISTINC
c6e0: 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64  T list is redund
c6f0: 61 6e 74 20 69 66 20 74 68 65 20 64 61 74 61 62  ant if the datab
c700: 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ase contains som
c710: 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 63  e subset of.** c
c720: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
c730: 75 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e 2d 6e  unique and non-n
c740: 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ull..*/.static i
c750: 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52 65 64  nt isDistinctRed
c760: 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20  undant(.  Parse 
c770: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
c780: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
c790: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
c7a0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
c7b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
c7c0: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
c7d0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
c7e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
c7f0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
c800: 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
c810: 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68  inct       /* Th
c820: 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 68 61  e result set tha
c830: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 44 49  t needs to be DI
c840: 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54  STINCT */.){.  T
c850: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
c860: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
c870: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
c890: 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a  int iBase;..  /*
c8a0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72   If there is mor
c8b0: 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65  e than one table
c8c0: 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69   or sub-select i
c8d0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
c8e0: 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71  e of.  ** this q
c8f0: 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69  uery, then it wi
c900: 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ll not be possib
c910: 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20  le to show that 
c920: 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20  the DISTINCT .  
c930: 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65 64  ** clause is red
c940: 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  undant. */.  if(
c950: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21   pTabList->nSrc!
c960: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
c970: 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73   iBase = pTabLis
c980: 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b  t->a[0].iCursor;
c990: 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69  .  pTab = pTabLi
c9a0: 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  st->a[0].pTab;..
c9b0: 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74    /* If any of t
c9c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  he expressions i
c9d0: 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20  s an IPK column 
c9e0: 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20  on table iBase, 
c9f0: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a  then return .  *
ca00: 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68  * true. Note: Th
ca10: 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  e (p->iTable==iB
ca20: 61 73 65 29 20 70 61 72 74 20 6f 66 20 74 68 69  ase) part of thi
ca30: 73 20 74 65 73 74 20 6d 61 79 20 62 65 20 66 61  s test may be fa
ca40: 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  lse if the.  ** 
ca50: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
ca60: 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
ca70: 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  ub-query..  */. 
ca80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73   for(i=0; i<pDis
ca90: 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  tinct->nExpr; i+
caa0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
cab0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
cac0: 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74 69 6e  pCollate(pDistin
cad0: 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  ct->a[i].pExpr);
cae0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
caf0: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e  TK_COLUMN && p->
cb00: 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26  iTable==iBase &&
cb10: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20   p->iColumn<0 ) 
cb20: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
cb30: 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
cb40: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20   all indices on 
cb50: 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b  the table, check
cb60: 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65 65 20  ing each to see 
cb70: 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a  if it makes.  **
cb80: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75   the DISTINCT qu
cb90: 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e  alifier redundan
cba0: 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66  t. It does so if
cbb0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e  :.  **.  **   1.
cbc0: 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 69 74   The index is it
cbd0: 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64  self UNIQUE, and
cbe0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20  .  **.  **   2. 
cbf0: 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  All of the colum
cc00: 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
cc10: 61 72 65 20 65 69 74 68 65 72 20 70 61 72 74 20  are either part 
cc20: 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e 63 74  of the pDistinct
cc30: 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c  .  **      list,
cc40: 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57 48 45   or else the WHE
cc50: 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  RE clause contai
cc60: 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  ns a term of the
cc70: 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20   form "col=X",. 
cc80: 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65 20 58   **      where X
cc90: 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76   is a constant v
cca0: 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74  alue. The collat
ccb0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66  ion sequences of
ccc0: 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63   the.  **      c
ccd0: 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65  omparison and se
cce0: 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73  lect-list expres
ccf0: 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68  sions must match
cd00: 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e   those of the in
cd10: 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  dex..  **.  **  
cd20: 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65   3. All of those
cd30: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66   index columns f
cd40: 6f 72 20 77 68 69 63 68 20 74 68 65 20 57 48 45  or which the WHE
cd50: 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  RE clause does n
cd60: 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e  ot.  **      con
cd70: 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74  tain a "col=X" t
cd80: 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20  erm are subject 
cd90: 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  to a NOT NULL co
cda0: 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20  nstraint..  */. 
cdb0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
cdc0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
cdd0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
cde0: 0a 20 20 20 20 69 66 28 20 21 49 73 55 6e 69 71  .    if( !IsUniq
cdf0: 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 20  ueIndex(pIdx) ) 
ce00: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
ce10: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
ce20: 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
ce30: 20 20 20 20 69 31 36 20 69 43 6f 6c 20 3d 20 70      i16 iCol = p
ce40: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
ce50: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66  ;.      if( 0==f
ce60: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61  indTerm(pWC, iBa
ce70: 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d  se, iCol, ~(Bitm
ce80: 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49  ask)0, WO_EQ, pI
ce90: 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  dx) ){.        i
cea0: 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e  nt iIdxCol = fin
ceb0: 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72 73 65  dIndexCol(pParse
cec0: 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69 42 61  , pDistinct, iBa
ced0: 73 65 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20 20  se, pIdx, i);.  
cee0: 20 20 20 20 20 20 69 66 28 20 69 49 64 78 43 6f        if( iIdxCo
cef0: 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f  l<0 || pTab->aCo
cf00: 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 3d  l[iCol].notNull=
cf10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
cf20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
cf30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
cf40: 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e     if( i==pIdx->
cf50: 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20  nKeyCol ){.     
cf60: 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69   /* This index i
cf70: 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20  mplies that the 
cf80: 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69  DISTINCT qualifi
cf90: 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  er is redundant.
cfa0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
cfb0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
cfc0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
cfd0: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
cfe0: 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  e logarithm of t
cff0: 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 20 74  he input value t
d000: 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61  o base 2..*/.sta
d010: 74 69 63 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f  tic LogEst estLo
d020: 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a 20 20 72  g(LogEst N){.  r
d030: 65 74 75 72 6e 20 4e 3c 3d 31 30 20 3f 20 30 20  eturn N<=10 ? 0 
d040: 3a 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  : sqlite3LogEst(
d050: 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a  N) - 33;.}../*.*
d060: 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66  * Two routines f
d070: 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20  or printing the 
d080: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71  content of an sq
d090: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
d0a0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20  .** structure.  
d0b0: 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
d0c0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
d0d0: 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72  nly.  If neither
d0e0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20  .** SQLITE_TEST 
d0f0: 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  or SQLITE_DEBUG 
d100: 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65  are defined, the
d110: 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  n these routines
d120: 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a  .** are no-ops..
d130: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
d140: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
d150: 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
d160: 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f  ined(WHERETRACE_
d170: 45 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20  ENABLED).static 
d180: 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49  void TRACE_IDX_I
d190: 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e  NPUTS(sqlite3_in
d1a0: 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
d1b0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71  int i;.  if( !sq
d1c0: 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
d1d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
d1e0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74  i=0; i<p->nConst
d1f0: 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
d200: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d210: 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e  ntf("  constrain
d220: 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65  t[%d]: col=%d te
d230: 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73  rmid=%d op=%d us
d240: 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  abled=%d\n",.   
d250: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
d260: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
d270: 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
d280: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
d290: 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20  ].iTermOffset,. 
d2a0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
d2b0: 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20  aint[i].op,.    
d2c0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
d2d0: 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20  t[i].usable);.  
d2e0: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
d2f0: 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  ->nOrderBy; i++)
d300: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
d310: 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65  ugPrintf("  orde
d320: 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20  rby[%d]: col=%d 
d330: 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  desc=%d\n",.    
d340: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
d350: 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  aOrderBy[i].iCol
d360: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
d370: 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29  OrderBy[i].desc)
d380: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
d390: 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  oid TRACE_IDX_OU
d3a0: 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e  TPUTS(sqlite3_in
d3b0: 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
d3c0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71  int i;.  if( !sq
d3d0: 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
d3e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
d3f0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74  i=0; i<p->nConst
d400: 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
d410: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d420: 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d  ntf("  usage[%d]
d430: 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69  : argvIdx=%d omi
d440: 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%d\n",.       
d450: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
d460: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
d470: 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20  .argvIndex,.    
d480: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
d490: 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b  tUsage[i].omit);
d4a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
d4b0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
d4c0: 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64  Num=%d\n", p->id
d4d0: 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  xNum);.  sqlite3
d4e0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69  DebugPrintf("  i
d4f0: 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e  dxStr=%s\n", p->
d500: 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  idxStr);.  sqlit
d510: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
d520: 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64   orderByConsumed
d530: 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72  =%d\n", p->order
d540: 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73  ByConsumed);.  s
d550: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d560: 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f  f("  estimatedCo
d570: 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74  st=%g\n", p->est
d580: 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 73  imatedCost);.  s
d590: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d5a0: 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 52 6f  f("  estimatedRo
d5b0: 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65  ws=%lld\n", p->e
d5c0: 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d  stimatedRows);.}
d5d0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54  .#else.#define T
d5e0: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
d5f0: 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  A).#define TRACE
d600: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a  _IDX_OUTPUTS(A).
d610: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
d620: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
d630: 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a  MATIC_INDEX./*.*
d640: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
d650: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
d660: 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20  e term pTerm is 
d670: 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20  of a form where 
d680: 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75  it.** could be u
d690: 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65  sed with an inde
d6a0: 78 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63  x to access pSrc
d6b0: 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70  , assuming an ap
d6c0: 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64  propriate.** ind
d6d0: 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73  ex existed..*/.s
d6e0: 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61  tatic int termCa
d6f0: 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57  nDriveIndex(.  W
d700: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d720: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
d730: 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  rm to check */. 
d740: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
d750: 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20  item *pSrc,     
d760: 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20  /* Table we are 
d770: 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73  trying to access
d780: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
d790: 74 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20  tReady          
d7a0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69       /* Tables i
d7b0: 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66  n outer loops of
d7c0: 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a   the join */.){.
d7d0: 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66    char aff;.  if
d7e0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
d7f0: 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  sor!=pSrc->iCurs
d800: 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  or ) return 0;. 
d810: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
d820: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d  erator & WO_EQ)=
d830: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
d840: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
d850: 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65  reqRight & notRe
d860: 61 64 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e  ady)!=0 ) return
d870: 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d   0;.  if( pTerm-
d880: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c 30 20  >u.leftColumn<0 
d890: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 66  ) return 0;.  af
d8a0: 66 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  f = pSrc->pTab->
d8b0: 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65  aCol[pTerm->u.le
d8c0: 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  ftColumn].affini
d8d0: 74 79 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74  ty;.  if( !sqlit
d8e0: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
d8f0: 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  k(pTerm->pExpr, 
d900: 61 66 66 29 20 29 20 72 65 74 75 72 6e 20 30 3b  aff) ) return 0;
d910: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
d920: 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
d930: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
d940: 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a  MATIC_INDEX./*.*
d950: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
d960: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
d970: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   Index object fo
d980: 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  r an automatic i
d990: 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73  ndex.** and to s
d9a0: 65 74 20 75 70 20 74 68 65 20 57 68 65 72 65 4c  et up the WhereL
d9b0: 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76  evel object pLev
d9c0: 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  el so that the c
d9d0: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  ode generator.**
d9e0: 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68   makes use of th
d9f0: 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
da00: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
da10: 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d  d constructAutom
da20: 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72  aticIndex(.  Par
da30: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
da40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
da50: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
da60: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
da70: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
da80: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
da90: 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
daa0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
dab0: 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src,  /* The FRO
dac0: 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
dad0: 20 67 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e   get the next in
dae0: 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  dex */.  Bitmask
daf0: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20   notReady,      
db00: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
db10: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
db20: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a   not available *
db30: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
db40: 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20  pLevel          
db50: 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64  /* Write new ind
db60: 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ex here */.){.  
db70: 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  int nKeyCol;    
db80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
db90: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
dba0: 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63   in the construc
dbb0: 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57  ted index */.  W
dbc0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
dbd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
dbe0: 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74  single term of t
dbf0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
dc00: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
dc10: 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20  pWCEnd;         
dc20: 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e   /* End of pWC->
dc30: 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  a[] */.  Index *
dc40: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
dc50: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64       /* Object d
dc60: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 74 72  escribing the tr
dc70: 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f  ansient index */
dc80: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dca0: 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65  * Prepared state
dcb0: 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
dcc0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
dcd0: 20 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20   addrInit;      
dce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
dcf0: 65 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69  ess of the initi
dd00: 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73  alization bypass
dd10: 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65   jump */.  Table
dd20: 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *pTable;       
dd30: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
dd40: 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65  ble being indexe
dd50: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  d */.  int addrT
dd60: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
dd70: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
dd80: 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70   index fill loop
dd90: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
dda0: 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
ddb0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
ddc0: 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72  lding an index r
ddd0: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
dde0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ddf0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
de00: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
de10: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
de20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
de30: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
de40: 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20  nt mxBitCol;    
de50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
de60: 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20  ximum column in 
de70: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f  pSrc->colUsed */
de80: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
de90: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
dea0: 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
deb0: 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c  ence to on a col
dec0: 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  umn */.  WhereLo
ded0: 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
dee0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70       /* The Loop
def0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
df00: 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20  r *zNotUsed;    
df10: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
df20: 61 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65  a space on the e
df30: 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20  nd of pIdx */.  
df40: 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b  Bitmask idxCols;
df50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
df60: 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73  itmap of columns
df70: 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69   used for indexi
df80: 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ng */.  Bitmask 
df90: 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20  extraCols;      
dfa0: 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
dfb0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
dfc0: 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74  mns */.  u8 sent
dfd0: 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20  Warning = 0;    
dfe0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
dff0: 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62  a warnning has b
e000: 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 0a 20  een issued */.. 
e010: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
e020: 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74  e to skip over t
e030: 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  he creation and 
e040: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
e050: 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  f the.  ** trans
e060: 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e  ient index on 2n
e070: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
e080: 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74   iterations of t
e090: 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20  he loop. */.  v 
e0a0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
e0b0: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
e0c0: 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20  );.  addrInit = 
e0d0: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
e0e0: 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76  pParse); VdbeCov
e0f0: 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
e100: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
e110: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
e120: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
e130: 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  o the index.  **
e140: 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74   and used to mat
e150: 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ch WHERE clause 
e160: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
e170: 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20   nKeyCol = 0;.  
e180: 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70  pTable = pSrc->p
e190: 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  Tab;.  pWCEnd = 
e1a0: 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65  &pWC->a[pWC->nTe
e1b0: 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  rm];.  pLoop = p
e1c0: 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
e1d0: 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20   idxCols = 0;.  
e1e0: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
e1f0: 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
e200: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
e210: 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
e220: 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
e230: 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
e240: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
e250: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
e260: 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
e270: 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
e280: 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d  BMS ? MASKBIT(BM
e290: 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69  S-1) : MASKBIT(i
e2a0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Col);.      test
e2b0: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20  case( iCol==BMS 
e2c0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
e2d0: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
e2e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e  ;.      if( !sen
e2f0: 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20  tWarning ){.    
e300: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
e310: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
e320: 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20  UTOINDEX,.      
e330: 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63        "automatic
e340: 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29   index on %s(%s)
e350: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
e360: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54  ,.            pT
e370: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  able->aCol[iCol]
e380: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
e390: 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31   sentWarning = 1
e3a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e3b0: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
e3c0: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
e3d0: 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
e3e0: 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e  pResize(pParse->
e3f0: 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43  db, pLoop, nKeyC
e400: 6f 6c 2b 31 29 20 29 20 72 65 74 75 72 6e 3b 0a  ol+1) ) return;.
e410: 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61          pLoop->a
e420: 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d  LTerm[nKeyCol++]
e430: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
e440: 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61    idxCols |= cMa
e450: 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sk;.      }.    
e460: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
e470: 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 70  nKeyCol>0 );.  p
e480: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
e490: 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72  q = pLoop->nLTer
e4a0: 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70  m = nKeyCol;.  p
e4b0: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
e4c0: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
e4d0: 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  | WHERE_IDX_ONLY
e4e0: 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   | WHERE_INDEXED
e4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e500: 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55        | WHERE_AU
e510: 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20  TO_INDEX;..  /* 
e520: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
e530: 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
e540: 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f  olumns needed to
e550: 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63   create a.  ** c
e560: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20  overing index.  
e570: 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  A "covering inde
e580: 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74  x" is an index t
e590: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  hat contains all
e5a0: 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68  .  ** columns th
e5b0: 61 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79  at are needed by
e5c0: 20 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74   the query.  Wit
e5d0: 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  h a covering ind
e5e0: 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69  ex, the.  ** ori
e5f0: 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65  ginal table neve
e600: 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63  r needs to be ac
e610: 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74  cessed.  Automat
e620: 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a  ic indices must.
e630: 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69    ** be a coveri
e640: 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65  ng index because
e650: 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20   the index will 
e660: 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69  not be updated i
e670: 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69  f the.  ** origi
e680: 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65  nal table change
e690: 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  s and the index 
e6a0: 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74  and table cannot
e6b0: 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20   both be used.  
e6c0: 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75  ** if they go ou
e6d0: 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a  t of sync..  */.
e6e0: 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53    extraCols = pS
e6f0: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e  rc->colUsed & (~
e700: 69 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49  idxCols | MASKBI
e710: 54 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42  T(BMS-1));.  mxB
e720: 69 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d  itCol = (pTable-
e730: 3e 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20  >nCol >= BMS-1) 
e740: 3f 20 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65  ? BMS-1 : pTable
e750: 2d 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61  ->nCol;.  testca
e760: 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  se( pTable->nCol
e770: 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73  ==BMS-1 );.  tes
e780: 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e  tcase( pTable->n
e790: 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  Col==BMS-2 );.  
e7a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74  for(i=0; i<mxBit
e7b0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
e7c0: 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d  f( extraCols & M
e7d0: 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b 65 79  ASKBIT(i) ) nKey
e7e0: 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  Col++;.  }.  if(
e7f0: 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
e800: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
e810: 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20 2b  ){.    nKeyCol +
e820: 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d  = pTable->nCol -
e830: 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20   BMS + 1;.  }.  
e840: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
e850: 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
e860: 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  Q | WHERE_IDX_ON
e870: 4c 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72  LY;..  /* Constr
e880: 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62  uct the Index ob
e890: 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65  ject to describe
e8a0: 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20   this index */. 
e8b0: 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 41   pIdx = sqlite3A
e8c0: 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65  llocateIndexObje
e8d0: 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  ct(pParse->db, n
e8e0: 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e  KeyCol+1, 0, &zN
e8f0: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 70  otUsed);.  if( p
e900: 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Idx==0 ) return;
e910: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
e920: 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  e.pIndex = pIdx;
e930: 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d  .  pIdx->zName =
e940: 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20   "auto-index";. 
e950: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20   pIdx->pTable = 
e960: 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b  pTable;.  n = 0;
e970: 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a  .  idxCols = 0;.
e980: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
e990: 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
e9a0: 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
e9b0: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
e9c0: 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
e9d0: 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
e9e0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
e9f0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
ea00: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
ea10: 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
ea20: 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28  >=BMS ? MASKBIT(
ea30: 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54  BMS-1) : MASKBIT
ea40: 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65  (iCol);.      te
ea50: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
ea60: 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
ea70: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
ea80: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
ea90: 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
eaa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  =0 ){.        Ex
eab0: 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
eac0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
ead0: 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b  dxCols |= cMask;
eae0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
eaf0: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65  iColumn[n] = pTe
eb00: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
eb10: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
eb20: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
eb30: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
eb40: 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
eb50: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
eb60: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
eb70: 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70  ll[n] = ALWAYS(p
eb80: 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a  Coll) ? pColl->z
eb90: 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b  Name : "BINARY";
eba0: 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  .        n++;.  
ebb0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ebc0: 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e    assert( (u32)n
ebd0: 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  ==pLoop->u.btree
ebe0: 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  .nEq );..  /* Ad
ebf0: 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  d additional col
ec00: 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d  umns needed to m
ec10: 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ake the automati
ec20: 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a  c index into.  *
ec30: 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  * a covering ind
ec40: 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ex */.  for(i=0;
ec50: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
ec60: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
ec70: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
ec80: 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ) ){.      pIdx-
ec90: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
eca0: 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
ecb0: 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
ecc0: 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  Y";.      n++;. 
ecd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
ece0: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d  Src->colUsed & M
ecf0: 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b  ASKBIT(BMS-1) ){
ed00: 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31  .    for(i=BMS-1
ed10: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
ed20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49  ; i++){.      pI
ed30: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
ed40: 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  = i;.      pIdx-
ed50: 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49  >azColl[n] = "BI
ed60: 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b  NARY";.      n++
ed70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
ed80: 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c  sert( n==nKeyCol
ed90: 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f   );.  pIdx->aiCo
eda0: 6c 75 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b 0a 20 20  lumn[n] = -1;.  
edb0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
edc0: 3d 20 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20 2f  = "BINARY";..  /
edd0: 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74  * Create the aut
ede0: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a  omatic index */.
edf0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
ee00: 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a  ->iIdxCur>=0 );.
ee10: 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
ee20: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
ee30: 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ++;.  sqlite3Vdb
ee40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
ee50: 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65  enAutoindex, pLe
ee60: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b  vel->iIdxCur, nK
ee70: 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69  eyCol+1);.  sqli
ee80: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
ee90: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
eea0: 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
eeb0: 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70  ((v, "for %s", p
eec0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Table->zName));.
eed0: 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61  .  /* Fill the a
eee0: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77  utomatic index w
eef0: 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ith content */. 
ef00: 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
ef10: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
ef20: 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65  OP_Rewind, pLeve
ef30: 6c 2d 3e 69 54 61 62 43 75 72 29 3b 20 56 64 62  l->iTabCur); Vdb
ef40: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
ef50: 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
ef60: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
ef70: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
ef80: 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
ef90: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70  (pParse, pIdx, p
efa0: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20  Level->iTabCur, 
efb0: 72 65 67 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c  regRecord, 0, 0,
efc0: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
efd0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
efe0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65  P_IdxInsert, pLe
eff0: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65  vel->iIdxCur, re
f000: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
f010: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
f020: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
f030: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
f040: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f050: 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c   OP_Next, pLevel
f060: 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72 54  ->iTabCur, addrT
f070: 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  op+1); VdbeCover
f080: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
f090: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
f0a0: 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
f0b0: 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20  US_AUTOINDEX);. 
f0c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
f0d0: 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29  Here(v, addrTop)
f0e0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
f0f0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
f100: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
f110: 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
f120: 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68  when skipping th
f130: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
f140: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
f150: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
f160: 72 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  rInit);.}.#endif
f170: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
f180: 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
f190: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
f1a0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
f1b0: 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ABLE./*.** Alloc
f1c0: 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
f1d0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
f1e0: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
f1f0: 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
f200: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
f210: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
f220: 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
f230: 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  se the structure
f240: 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74  .** by passing t
f250: 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
f260: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
f270: 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f  tion to sqlite3_
f280: 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
f290: 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  c sqlite3_index_
f2a0: 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e  info *allocateIn
f2b0: 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65  dexInfo(.  Parse
f2c0: 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65 72   *pParse,.  Wher
f2d0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20  eClause *pWC,.  
f2e0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
f2f0: 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70  tem *pSrc,.  Exp
f300: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a  rList *pOrderBy.
f310: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
f320: 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74   int nTerm;.  st
f330: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
f340: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
f350: 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
f360: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
f370: 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64  orderby *pIdxOrd
f380: 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73  erBy;.  struct s
f390: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
f3a0: 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
f3b0: 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
f3c0: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
f3d0: 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c   nOrderBy;.  sql
f3e0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
f3f0: 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  *pIdxInfo;..  /*
f400: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
f410: 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48  r of possible WH
f420: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
f430: 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67  raints referring
f440: 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69  .  ** to this vi
f450: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
f460: 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20   for(i=nTerm=0, 
f470: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
f480: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
f490: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
f4a0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
f4b0: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
f4c0: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
f4d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49 73  ;.    assert( Is
f4e0: 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d  PowerOfTwo(pTerm
f4f0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57  ->eOperator & ~W
f500: 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20  O_EQUIV) );.    
f510: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
f520: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
f530: 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IN );.    testca
f540: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
f550: 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
f560: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
f570: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
f580: 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20  or & WO_ALL );. 
f590: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
f5a0: 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f  Operator & ~(WO_
f5b0: 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 29  ISNULL|WO_EQUIV)
f5c0: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
f5d0: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
f5e0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
f5f0: 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
f600: 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20  .    nTerm++;.  
f610: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f  }..  /* If the O
f620: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
f630: 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c  ontains only col
f640: 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72  umns in the curr
f650: 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61  ent .  ** virtua
f660: 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c  l table then all
f670: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
f680: 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72  the aOrderBy par
f690: 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71  t of.  ** the sq
f6a0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
f6b0: 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f   structure..  */
f6c0: 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b  .  nOrderBy = 0;
f6d0: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
f6e0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
f6f0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
f700: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
f710: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
f720: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
f730: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
f740: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
f750: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
f760: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
f770: 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e!=pSrc->iCursor
f780: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
f790: 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20      if( i==n){. 
f7a0: 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20       nOrderBy = 
f7b0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
f7c0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
f7d0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
f7e0: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  fo structure.  *
f7f0: 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73  /.  pIdxInfo = s
f800: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
f810: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
f820: 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29  izeof(*pIdxInfo)
f830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f840: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73              + (s
f850: 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29  izeof(*pIdxCons)
f860: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67   + sizeof(*pUsag
f870: 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20  e))*nTerm.      
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70       + sizeof(*p
f8a0: 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64  IdxOrderBy)*nOrd
f8b0: 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49  erBy );.  if( pI
f8c0: 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  dxInfo==0 ){.   
f8d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f8e0: 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66  (pParse, "out of
f8f0: 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72   memory");.    r
f900: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
f910: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
f920: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
f930: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
f940: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63  info structure c
f950: 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e  ontains.  ** man
f960: 79 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72  y fields that ar
f970: 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73  e declared "cons
f980: 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42  t" to prevent xB
f990: 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20  estIndex from.  
f9a0: 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d  ** changing them
f9b0: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  .  We have to do
f9c0: 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74   some funky cast
f9d0: 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a  ing in order to.
f9e0: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
f9f0: 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20  those fields..  
fa00: 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  */.  pIdxCons = 
fa10: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
fa20: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
fa30: 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a  *)&pIdxInfo[1];.
fa40: 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20    pIdxOrderBy = 
fa50: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
fa60: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26  index_orderby*)&
fa70: 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b  pIdxCons[nTerm];
fa80: 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72  .  pUsage = (str
fa90: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
faa0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
fab0: 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79  ge*)&pIdxOrderBy
fac0: 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28  [nOrderBy];.  *(
fad0: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
fae0: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54  nConstraint = nT
faf0: 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70  erm;.  *(int*)&p
fb00: 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
fb10: 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  y = nOrderBy;.  
fb20: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
fb30: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
fb40: 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
fb50: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
fb60: 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63  xCons;.  *(struc
fb70: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
fb80: 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49  orderby**)&pIdxI
fb90: 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20  nfo->aOrderBy = 
fba0: 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a  pIdxOrderBy;.  *
fbb0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
fbc0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
fbd0: 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e  _usage**)&pIdxIn
fbe0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
fbf0: 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20  sage =.         
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc30: 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65            pUsage
fc40: 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  ;..  for(i=j=0, 
fc50: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
fc60: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
fc70: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75   pTerm++){.    u
fc80: 38 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54  8 op;.    if( pT
fc90: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
fca0: 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
fcb0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
fcc0: 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72   assert( IsPower
fcd0: 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70  OfTwo(pTerm->eOp
fce0: 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55  erator & ~WO_EQU
fcf0: 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  IV) );.    testc
fd00: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
fd10: 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b  rator & WO_IN );
fd20: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
fd30: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
fd40: 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  & WO_ISNULL );. 
fd50: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
fd60: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
fd70: 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66  WO_ALL );.    if
fd80: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
fd90: 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c  tor & ~(WO_ISNUL
fda0: 4c 7c 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20  L|WO_EQUIV))==0 
fdb0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
fdc0: 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
fdd0: 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  gs & TERM_VNULL 
fde0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
fdf0: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c  pIdxCons[j].iCol
fe00: 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  umn = pTerm->u.l
fe10: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  eftColumn;.    p
fe20: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d  IdxCons[j].iTerm
fe30: 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20  Offset = i;.    
fe40: 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e  op = (u8)pTerm->
fe50: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
fe60: 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d  LL;.    if( op==
fe70: 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f  WO_IN ) op = WO_
fe80: 45 51 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  EQ;.    pIdxCons
fe90: 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 20  [j].op = op;.   
fea0: 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20 61   /* The direct a
feb0: 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65  ssignment in the
fec0: 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69   previous line i
fed0: 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20  s possible only 
fee0: 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74  because.    ** t
fef0: 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54  he WO_ and SQLIT
ff00: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
ff10: 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64  NT_ codes are id
ff20: 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20  entical.  The.  
ff30: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61    ** following a
ff40: 73 73 65 72 74 73 20 76 65 72 69 66 79 20 74 68  sserts verify th
ff50: 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20  is fact. */.    
ff60: 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53  assert( WO_EQ==S
ff70: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
ff80: 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20  TRAINT_EQ );.   
ff90: 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d   assert( WO_LT==
ffa0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
ffb0: 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20  STRAINT_LT );.  
ffc0: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d    assert( WO_LE=
ffd0: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
ffe0: 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20  NSTRAINT_LE );. 
fff0: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54     assert( WO_GT
10000 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
10010 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a  ONSTRAINT_GT );.
10020 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
10030 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  E==SQLITE_INDEX_
10040 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b  CONSTRAINT_GE );
10050 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
10060 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e  MATCH==SQLITE_IN
10070 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d  DEX_CONSTRAINT_M
10080 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73 65  ATCH );.    asse
10090 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
100a0 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f  ator & (WO_IN|WO
100b0 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  _EQ|WO_LT|WO_LE|
100c0 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d  WO_GT|WO_GE|WO_M
100d0 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b  ATCH) );.    j++
100e0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
100f0 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
10100 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
10110 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
10120 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [i].pExpr;.    p
10130 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43  IdxOrderBy[i].iC
10140 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
10150 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78  Column;.    pIdx
10160 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20  OrderBy[i].desc 
10170 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
10180 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  .sortOrder;.  }.
10190 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e  .  return pIdxIn
101a0 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  fo;.}../*.** The
101b0 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65   table object re
101c0 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20 61  ference passed a
101d0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
101e0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
101f0 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72  nction.** must r
10200 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74 75  epresent a virtu
10210 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66  al table. This f
10220 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20  unction invokes 
10230 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29  the xBestIndex()
10240 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  .** method of th
10250 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
10260 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65 33  with the sqlite3
10270 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a 65  _index_info obje
10280 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65 73  ct that.** comes
10290 20 69 6e 20 61 73 20 74 68 65 20 33 72 64 20 61   in as the 3rd a
102a0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
102b0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
102c0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
102d0 72 73 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f  rs, pParse is po
102e0 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20  pulated with an 
102f0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e  error message an
10300 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20  d a.** non-zero 
10310 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
10320 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20  d. Otherwise, 0 
10330 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
10340 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61  the output.** pa
10350 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  rt of the sqlite
10360 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
10370 75 63 74 75 72 65 20 69 73 20 6c 65 66 74 20 70  ucture is left p
10380 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  opulated..**.** 
10390 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
103a0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
103b0 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65 20 72  ned, it is the r
103c0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
103d0 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74   the.** caller t
103e0 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
103f0 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70  e p->idxStr if p
10400 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
10410 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  tr indicates.** 
10420 74 68 61 74 20 74 68 69 73 20 69 73 20 72 65 71  that this is req
10430 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  uired..*/.static
10440 20 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64   int vtabBestInd
10450 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
10460 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73  , Table *pTab, s
10470 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
10480 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  o *p){.  sqlite3
10490 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73  _vtab *pVtab = s
104a0 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
104b0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
104c0 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20  )->pVtab;.  int 
104d0 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  i;.  int rc;..  
104e0 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
104f0 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61  (p);.  rc = pVta
10500 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73  b->pModule->xBes
10510 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29  tIndex(pVtab, p)
10520 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  ;.  TRACE_IDX_OU
10530 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66 28  TPUTS(p);..  if(
10540 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10550 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
10560 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
10570 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
10580 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
10590 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
105a0 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20  !pVtab->zErrMsg 
105b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
105c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
105d0 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72   "%s", sqlite3Er
105e0 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d  rStr(rc));.    }
105f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
10600 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
10610 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d  se, "%s", pVtab-
10620 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d  >zErrMsg);.    }
10630 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
10640 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ree(pVtab->zErrM
10650 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45  sg);.  pVtab->zE
10660 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f  rrMsg = 0;..  fo
10670 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
10680 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
10690 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73     if( !p->aCons
106a0 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
106b0 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69   && p->aConstrai
106c0 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
106d0 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  ndex>0 ){.      
106e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
106f0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
10700 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42     "table %s: xB
10710 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65  estIndex returne
10720 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61  d an invalid pla
10730 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
10740 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
10750 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45  eturn pParse->nE
10760 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rr;.}.#endif /* 
10770 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
10780 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
10790 45 29 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 53  E) */...#ifdef S
107a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
107b0 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
107c0 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c  * Estimate the l
107d0 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72  ocation of a par
107e0 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e  ticular key amon
107f0 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e  g all keys in an
10800 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72  .** index.  Stor
10810 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
10820 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77   aStat as follow
10830 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61  s:.**.**    aSta
10840 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[0]      Est. n
10850 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65  umber of rows le
10860 73 73 20 74 68 61 6e 20 70 56 61 6c 0a 2a 2a 20  ss than pVal.** 
10870 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20     aStat[1]     
10880 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
10890 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 56  rows equal to pV
108a0 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  al.**.** Return 
108b0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
108c0 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cess..*/.static 
108d0 76 6f 69 64 20 77 68 65 72 65 4b 65 79 53 74 61  void whereKeySta
108e0 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ts(.  Parse *pPa
108f0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
10900 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
10910 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  nnection */.  In
10920 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
10930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
10940 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64  ex to consider d
10950 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e  omain of */.  Un
10960 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
10970 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56 65 63  ec,       /* Vec
10980 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f  tor of values to
10990 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69   consider */.  i
109a0 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20  nt roundUp,     
109b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
109c0 75 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e 20  und up if true. 
109d0 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66   Round down if f
109e0 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  alse */.  tRowcn
109f0 74 20 2a 61 53 74 61 74 20 20 20 20 20 20 20 20  t *aStat        
10a00 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74        /* OUT: st
10a10 61 74 73 20 77 72 69 74 74 65 6e 20 68 65 72 65  ats written here
10a20 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53 61   */.){.  IndexSa
10a30 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20  mple *aSample = 
10a40 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20  pIdx->aSample;. 
10a50 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20   int iCol;      
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a70 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69 72 65  Index of require
10a80 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45 71 5b  d stats in anEq[
10a90 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  ] etc. */.  int 
10aa0 69 4d 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  iMin = 0;       
10ab0 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c          /* Small
10ac0 65 73 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79  est sample not y
10ad0 65 74 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69  et tested */.  i
10ae0 6e 74 20 69 20 3d 20 70 49 64 78 2d 3e 6e 53 61  nt i = pIdx->nSa
10af0 6d 70 6c 65 3b 20 20 20 20 20 20 2f 2a 20 53 6d  mple;      /* Sm
10b00 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c 61  allest sample la
10b10 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  rger than or equ
10b20 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20  al to pRec */.  
10b30 69 6e 74 20 69 54 65 73 74 3b 20 20 20 20 20 20  int iTest;      
10b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10b50 65 78 74 20 73 61 6d 70 6c 65 20 74 6f 20 74 65  ext sample to te
10b60 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b  st */.  int res;
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b80 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
10b90 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
10ba0 61 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ation */..#ifnde
10bb0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
10bc0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
10bd0 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65 6e  R( pParse );.#en
10be0 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 52  dif.  assert( pR
10bf0 65 63 21 3d 30 20 29 3b 0a 20 20 69 43 6f 6c 20  ec!=0 );.  iCol 
10c00 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 2d  = pRec->nField -
10c10 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   1;.  assert( pI
10c20 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b  dx->nSample>0 );
10c30 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 63 2d  .  assert( pRec-
10c40 3e 6e 46 69 65 6c 64 3e 30 20 26 26 20 69 43 6f  >nField>0 && iCo
10c50 6c 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43  l<pIdx->nSampleC
10c60 6f 6c 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  ol );.  do{.    
10c70 69 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 29  iTest = (iMin+i)
10c80 2f 32 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71  /2;.    res = sq
10c90 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
10ca0 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
10cb0 54 65 73 74 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  Test].n, aSample
10cc0 5b 69 54 65 73 74 5d 2e 70 2c 20 70 52 65 63 29  [iTest].p, pRec)
10cd0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20  ;.    if( res<0 
10ce0 29 7b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20  ){.      iMin = 
10cf0 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c  iTest+1;.    }el
10d00 73 65 7b 0a 20 20 20 20 20 20 69 20 3d 20 69 54  se{.      i = iT
10d10 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  est;.    }.  }wh
10d20 69 6c 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e  ile( res && iMin
10d30 3c 69 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  <i );..#ifdef SQ
10d40 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
10d50 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
10d60 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
10d70 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 62  check that the b
10d80 69 6e 61 72 79 20 73 65 61 72 63 68 20 63 6f 64  inary search cod
10d90 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75  e.  ** above fou
10da0 6e 64 20 74 68 65 20 72 69 67 68 74 20 61 6e 73  nd the right ans
10db0 77 65 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  wer. This block 
10dc0 73 65 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73  serves no purpos
10dd0 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61  e other.  ** tha
10de0 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  n to invoke the 
10df0 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69  asserts.  */.  i
10e00 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
10e10 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20   /* If (res==0) 
10e20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 73 61  is true, then sa
10e30 6d 70 6c 65 20 24 69 20 6d 75 73 74 20 62 65 20  mple $i must be 
10e40 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f  equal to pRec */
10e50 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70  .    assert( i<p
10e60 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a  Idx->nSample );.
10e70 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73      assert( 0==s
10e80 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
10e90 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
10ea0 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  i].n, aSample[i]
10eb0 2e 70 2c 20 70 52 65 63 29 0a 20 20 20 20 20 20  .p, pRec).      
10ec0 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62     || pParse->db
10ed0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
10ee0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
10ef0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65  * Otherwise, pRe
10f00 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65  c must be smalle
10f10 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69  r than sample $i
10f20 20 61 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e   and larger than
10f30 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28  .    ** sample (
10f40 24 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61  $i-1).  */.    a
10f50 73 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e  ssert( i==pIdx->
10f60 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20  nSample .       
10f70 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65    || sqlite3Vdbe
10f80 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
10f90 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d  ample[i].n, aSam
10fa0 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e  ple[i].p, pRec)>
10fb0 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50  0.         || pP
10fc0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
10fd0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73  Failed );.    as
10fe0 73 65 72 74 28 20 69 3d 3d 30 0a 20 20 20 20 20  sert( i==0.     
10ff0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64      || sqlite3Vd
11000 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
11010 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20  aSample[i-1].n, 
11020 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20  aSample[i-1].p, 
11030 70 52 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20  pRec)<0.        
11040 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
11050 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
11060 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66    }.#endif /* if
11070 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
11080 20 2a 2f 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69   */..  /* At thi
11090 73 20 70 6f 69 6e 74 2c 20 61 53 61 6d 70 6c 65  s point, aSample
110a0 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72 73 74  [i] is the first
110b0 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20   sample that is 
110c0 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 2a  greater than.  *
110d0 2a 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 56  * or equal to pV
110e0 61 6c 2e 20 20 4f 72 20 69 66 20 69 3d 3d 70 49  al.  Or if i==pI
110f0 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74 68 65  dx->nSample, the
11100 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 61 72  n all samples ar
11110 65 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e  e less.  ** than
11120 20 70 56 61 6c 2e 20 20 49 66 20 61 53 61 6d 70   pVal.  If aSamp
11130 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74 68 65  le[i]==pVal, the
11140 6e 20 72 65 73 3d 3d 30 2e 0a 20 20 2a 2f 0a 20  n res==0..  */. 
11150 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
11160 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53     aStat[0] = aS
11170 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43  ample[i].anLt[iC
11180 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31  ol];.    aStat[1
11190 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  ] = aSample[i].a
111a0 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c  nEq[iCol];.  }el
111b0 73 65 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20  se{.    tRowcnt 
111c0 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72 2c 20  iLower, iUpper, 
111d0 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3d  iGap;.    if( i=
111e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77  =0 ){.      iLow
111f0 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55  er = 0;.      iU
11200 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 30  pper = aSample[0
11210 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anLt[iCol];.  
11220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
11230 36 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74  64 nRow0 = sqlit
11240 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 49  e3LogEstToInt(pI
11250 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  dx->aiRowLogEst[
11260 30 5d 29 3b 0a 20 20 20 20 20 20 69 55 70 70 65  0]);.      iUppe
11270 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61  r = i>=pIdx->nSa
11280 6d 70 6c 65 20 3f 20 6e 52 6f 77 30 20 3a 20 61  mple ? nRow0 : a
11290 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69  Sample[i].anLt[i
112a0 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 4c 6f 77  Col];.      iLow
112b0 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31  er = aSample[i-1
112c0 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 20 2b 20 61  ].anEq[iCol] + a
112d0 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e 4c 74  Sample[i-1].anLt
112e0 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20  [iCol];.    }.  
112f0 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64    aStat[1] = pId
11300 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d 3b  x->aAvgEq[iCol];
11310 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e  .    if( iLower>
11320 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20  =iUpper ){.     
11330 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d   iGap = 0;.    }
11340 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
11350 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77   = iUpper - iLow
11360 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  er;.    }.    if
11370 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20  ( roundUp ){.   
11380 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a     iGap = (iGap*
11390 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  2)/3;.    }else{
113a0 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47  .      iGap = iG
113b0 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ap/3;.    }.    
113c0 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65  aStat[0] = iLowe
113d0 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 7d 0a  r + iGap;.  }.}.
113e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
113f0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
11400 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
11410 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   If it is not NU
11420 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20 74  LL, pTerm is a t
11430 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64 65  erm that provide
11440 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f  s an upper or lo
11450 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20  wer.** bound on 
11460 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57 69  a range scan. Wi
11470 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69 6e  thout considerin
11480 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20 65  g pTerm, it is e
11490 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61  stimated .** tha
114a0 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20  t the scan will 
114b0 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e  visit nNew rows.
114c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
114d0 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
114e0 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74  r.** estimated t
114f0 6f 20 62 65 20 76 69 73 69 74 65 64 20 61 66 74  o be visited aft
11500 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d 20  er taking pTerm 
11510 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a  into account..**
11520 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20  .** If the user 
11530 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69  explicitly speci
11540 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f  fied a likelihoo
11550 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74 68  d() value for th
11560 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e  is term,.** then
11570 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
11580 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69 68  e is the likelih
11590 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20 62  ood multiplied b
115a0 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
115b0 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f  ** input rows. O
115c0 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 66  therwise, this f
115d0 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
115e0 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54 20  that an "IS NOT 
115f0 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61  NULL" term.** ha
11600 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f  s a likelihood o
11610 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20  f 0.50, and any 
11620 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69 6b  other term a lik
11630 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e  elihood of 0.25.
11640 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73  .*/.static LogEs
11650 74 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  t whereRangeAdju
11660 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54  st(WhereTerm *pT
11670 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77  erm, LogEst nNew
11680 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65 74  ){.  LogEst nRet
11690 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70   = nNew;.  if( p
116a0 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20  Term ){.    if( 
116b0 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
116c0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  <=0 ){.      nRe
116d0 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74  t += pTerm->trut
116e0 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65  hProb;.    }else
116f0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46   if( (pTerm->wtF
11700 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
11710 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  L)==0 ){.      n
11720 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20  Ret -= 20;      
11730 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71    assert( 20==sq
11740 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29  lite3LogEst(4) )
11750 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11760 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 23 69  turn nRet;.}..#i
11770 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
11780 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
11790 34 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75  4./* .** This fu
117a0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
117b0 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
117c0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
117d0 76 69 73 69 74 65 64 20 62 79 20 61 0a 2a 2a 20  visited by a.** 
117e0 72 61 6e 67 65 2d 73 63 61 6e 20 6f 6e 20 61 20  range-scan on a 
117f0 73 6b 69 70 2d 73 63 61 6e 20 69 6e 64 65 78 2e  skip-scan index.
11800 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
11810 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
11820 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62  EX i1 ON t1(a, b
11830 2c 20 63 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  , c);.**   SELEC
11840 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
11850 45 20 61 3d 3f 20 41 4e 44 20 63 20 42 45 54 57  E a=? AND c BETW
11860 45 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a  EEN ? AND ?;.**.
11870 2a 2a 20 56 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e  ** Value pLoop->
11880 6e 4f 75 74 20 69 73 20 63 75 72 72 65 6e 74 6c  nOut is currentl
11890 79 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  y set to the est
118a0 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
118b0 20 72 6f 77 73 20 0a 2a 2a 20 76 69 73 69 74 65   rows .** visite
118c0 64 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 28  d for scanning (
118d0 61 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e 20 54 68  a=? AND b=?). Th
118e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 64 75  is function redu
118f0 63 65 73 20 74 68 61 74 20 65 73 74 69 6d 61 74  ces that estimat
11900 65 20 0a 2a 2a 20 62 79 20 73 6f 6d 65 20 66 61  e .** by some fa
11910 63 74 6f 72 20 74 6f 20 61 63 63 6f 75 6e 74 20  ctor to account 
11920 66 6f 72 20 74 68 65 20 28 63 20 42 45 54 57 45  for the (c BETWE
11930 45 4e 20 3f 20 41 4e 44 20 3f 29 20 65 78 70 72  EN ? AND ?) expr
11940 65 73 73 69 6f 6e 20 62 61 73 65 64 0a 2a 2a 20  ession based.** 
11950 6f 6e 20 74 68 65 20 73 74 61 74 34 20 64 61 74  on the stat4 dat
11960 61 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  a for the index.
11970 20 74 68 69 73 20 73 63 61 6e 20 77 69 6c 6c 20   this scan will 
11980 62 65 20 70 65 66 6f 72 6d 65 64 20 6d 75 6c 74  be peformed mult
11990 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 20 28  iple .** times (
119a0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 28 61  once for each (a
119b0 2c 62 29 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  ,b) combination 
119c0 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 3d 3f  that matches a=?
119d0 29 20 69 73 20 64 65 61 6c 74 20 77 69 74 68 20  ) is dealt with 
119e0 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65  .** by the calle
119f0 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f 65 73  r..**.** It does
11a00 20 74 68 69 73 20 62 79 20 73 63 61 6e 6e 69 6e   this by scannin
11a10 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 74  g through all st
11a20 61 74 34 20 73 61 6d 70 6c 65 73 2c 20 63 6f 6d  at4 samples, com
11a30 70 61 72 69 6e 67 20 76 61 6c 75 65 73 0a 2a 2a  paring values.**
11a40 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
11a50 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
11a60 72 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  r with the corre
11a70 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20  sponding column 
11a80 69 6e 20 65 61 63 68 0a 2a 2a 20 73 61 6d 70 6c  in each.** sampl
11a90 65 2e 20 49 66 20 4c 20 61 6e 64 20 55 20 61 72  e. If L and U ar
11aa0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
11ab0 73 61 6d 70 6c 65 73 20 66 6f 75 6e 64 20 74 6f  samples found to
11ac0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
11ad0 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65  .** equal to the
11ae0 20 76 61 6c 75 65 73 20 65 78 74 72 61 63 74 65   values extracte
11af0 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e  d from pLower an
11b00 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74  d pUpper respect
11b10 69 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20  ively, and.** N 
11b20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
11b30 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 2c 20  ber of samples, 
11b40 74 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  the pLoop->nOut 
11b50 76 61 6c 75 65 20 69 73 20 61 64 6a 75 73 74 65  value is adjuste
11b60 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d.** as follows:
11b70 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20 3d 20  .**.**   nOut = 
11b80 6e 4f 75 74 20 2a 20 28 20 6d 69 6e 28 55 20 2d  nOut * ( min(U -
11b90 20 4c 2c 20 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a   L, 1) / N ).**.
11ba0 2a 2a 20 49 66 20 70 4c 6f 77 65 72 20 69 73 20  ** If pLower is 
11bb0 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65  NULL, or a value
11bc0 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
11bd0 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 74 65  cted from the te
11be0 72 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73 65 74 20  rm, L is.** set 
11bf0 74 6f 20 7a 65 72 6f 2e 20 49 66 20 70 55 70 70  to zero. If pUpp
11c00 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61  er is NULL, or a
11c10 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
11c20 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
11c30 69 74 2c 0a 2a 2a 20 55 20 69 73 20 73 65 74 20  it,.** U is set 
11c40 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  to N..**.** Norm
11c50 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
11c60 69 6f 6e 20 73 65 74 73 20 2a 70 62 44 6f 6e 65  ion sets *pbDone
11c70 20 74 6f 20 31 20 62 65 66 6f 72 65 20 72 65 74   to 1 before ret
11c80 75 72 6e 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c  urning. However,
11c90 0a 2a 2a 20 69 66 20 6e 6f 20 76 61 6c 75 65 20  .** if no value 
11ca0 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64  can be extracted
11cb0 20 66 72 6f 6d 20 65 69 74 68 65 72 20 70 4c 6f   from either pLo
11cc0 77 65 72 20 6f 72 20 70 55 70 70 65 72 20 28 61  wer or pUpper (a
11cd0 6e 64 20 73 6f 20 74 68 65 0a 2a 2a 20 65 73 74  nd so the.** est
11ce0 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
11cf0 62 65 72 20 6f 66 20 72 6f 77 73 20 64 65 6c 69  ber of rows deli
11d00 76 65 72 65 64 20 72 65 6d 61 69 6e 73 20 75 6e  vered remains un
11d10 63 68 61 6e 67 65 64 29 2c 20 2a 70 62 44 6f 6e  changed), *pbDon
11d20 65 0a 2a 2a 20 69 73 20 6c 65 66 74 20 61 73 20  e.** is left as 
11d30 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  is..**.** If an 
11d40 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
11d50 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
11d60 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
11d70 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 53  Otherwise, .** S
11d80 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
11d90 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
11da0 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28 0a 20  geSkipScanEst(. 
11db0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11dc0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11dd0 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
11de0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
11df0 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
11e00 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
11e10 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
11e20 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
11e30 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
11e40 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
11e50 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
11e60 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
11e70 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
11e80 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
11e90 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
11ea0 6f 70 2c 20 20 20 20 2f 2a 20 55 70 64 61 74 65  op,    /* Update
11eb0 20 74 68 65 20 2e 6e 4f 75 74 20 76 61 6c 75 65   the .nOut value
11ec0 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f   of this loop */
11ed0 0a 20 20 69 6e 74 20 2a 70 62 44 6f 6e 65 20 20  .  int *pbDone  
11ee0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
11ef0 6f 20 74 72 75 65 20 69 66 20 61 74 20 6c 65 61  o true if at lea
11f00 73 74 20 6f 6e 65 20 65 78 70 72 2e 20 76 61 6c  st one expr. val
11f10 75 65 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a  ue extracted */.
11f20 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
11f30 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
11f40 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71  Index;.  int nEq
11f50 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
11f60 65 2e 6e 45 71 3b 0a 20 20 73 71 6c 69 74 65 33  e.nEq;.  sqlite3
11f70 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
11f80 62 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77 65 72 20  b;.  int nLower 
11f90 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 55 70 70  = -1;.  int nUpp
11fa0 65 72 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b  er = p->nSample+
11fb0 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  1;.  int rc = SQ
11fc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
11fd0 43 6f 6c 20 3d 20 70 2d 3e 61 69 43 6f 6c 75 6d  Col = p->aiColum
11fe0 6e 5b 6e 45 71 5d 3b 0a 20 20 75 38 20 61 66 66  n[nEq];.  u8 aff
11ff0 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 2d 3e   = iCol>=0 ? p->
12000 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
12010 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20 53 51  l].affinity : SQ
12020 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
12030 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
12040 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33  ll;.  .  sqlite3
12050 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20 30 3b 20  _value *p1 = 0; 
12060 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
12070 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
12080 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73 71 6c   pLower */.  sql
12090 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 32 20 3d  ite3_value *p2 =
120a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
120b0 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  Value extracted 
120c0 66 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f 0a 20  from pUpper */. 
120d0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
120e0 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  pVal = 0;       
120f0 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63   /* Value extrac
12100 74 65 64 20 66 72 6f 6d 20 72 65 63 6f 72 64 20  ted from record 
12110 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  */..  pColl = sq
12120 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
12130 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 61 7a  eq(pParse, p->az
12140 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69 66  Coll[nEq]);.  if
12150 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  ( pLower ){.    
12160 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
12170 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70  4ValueFromExpr(p
12180 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d 3e 70  Parse, pLower->p
12190 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
121a0 66 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e 4c 6f  f, &p1);.    nLo
121b0 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  wer = 0;.  }.  i
121c0 66 28 20 70 55 70 70 65 72 20 26 26 20 72 63 3d  f( pUpper && rc=
121d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
121e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
121f0 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  at4ValueFromExpr
12200 28 70 50 61 72 73 65 2c 20 70 55 70 70 65 72 2d  (pParse, pUpper-
12210 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
12220 61 66 66 2c 20 26 70 32 29 3b 0a 20 20 20 20 6e  aff, &p2);.    n
12230 55 70 70 65 72 20 3d 20 70 32 20 3f 20 30 20 3a  Upper = p2 ? 0 :
12240 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20 7d   p->nSample;.  }
12250 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c 20 70 32  ..  if( p1 || p2
12260 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
12270 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a 20 20     int nDiff;.  
12280 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
12290 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d  QLITE_OK && i<p-
122a0 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
122b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
122c0 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28 64 62  e3Stat4Column(db
122d0 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e  , p->aSample[i].
122e0 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d  p, p->aSample[i]
122f0 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c 29 3b  .n, nEq, &pVal);
12300 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
12310 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 20 29  QLITE_OK && p1 )
12320 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
12330 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  s = sqlite3MemCo
12340 6d 70 61 72 65 28 70 31 2c 20 70 56 61 6c 2c 20  mpare(p1, pVal, 
12350 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pColl);.        
12360 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 4c 6f  if( res>=0 ) nLo
12370 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  wer++;.      }. 
12380 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
12390 49 54 45 5f 4f 4b 20 26 26 20 70 32 20 29 7b 0a  ITE_OK && p2 ){.
123a0 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20          int res 
123b0 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
123c0 61 72 65 28 70 32 2c 20 70 56 61 6c 2c 20 70 43  are(p2, pVal, pC
123d0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oll);.        if
123e0 28 20 72 65 73 3e 3d 30 20 29 20 6e 55 70 70 65  ( res>=0 ) nUppe
123f0 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r++;.      }.   
12400 20 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d 20 28   }.    nDiff = (
12410 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65 72 29  nUpper - nLower)
12420 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66 3c  ;.    if( nDiff<
12430 3d 30 20 29 20 6e 44 69 66 66 20 3d 20 31 3b 0a  =0 ) nDiff = 1;.
12440 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
12450 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65   is both an uppe
12460 72 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e  r and lower boun
12470 64 20 73 70 65 63 69 66 69 65 64 2c 20 61 6e 64  d specified, and
12480 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6d   the .    ** com
12490 70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63 61 74  parisons indicat
124a0 65 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  e that they are 
124b0 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 2c 20  close together, 
124c0 75 73 65 20 74 68 65 20 66 61 6c 6c 62 61 63 6b  use the fallback
124d0 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 28  .    ** method (
124e0 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
124f0 73 63 61 6e 20 76 69 73 69 74 73 20 31 2f 36 34  scan visits 1/64
12500 20 6f 66 20 74 68 65 20 72 6f 77 73 29 20 66 6f   of the rows) fo
12510 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 20 20 20  r estimating.   
12520 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   ** the number o
12530 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 2e 20  f rows visited. 
12540 4f 74 68 65 72 77 69 73 65 2c 20 65 73 74 69 6d  Otherwise, estim
12550 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
12560 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 75 73  f rows.    ** us
12570 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64 20 64  ing the method d
12580 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
12590 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66  header comment f
125a0 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  or this function
125b0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 44 69  . */.    if( nDi
125c0 66 66 21 3d 31 20 7c 7c 20 70 55 70 70 65 72 3d  ff!=1 || pUpper=
125d0 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30 20  =0 || pLower==0 
125e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 64  ){.      int nAd
125f0 6a 75 73 74 20 3d 20 28 73 71 6c 69 74 65 33 4c  just = (sqlite3L
12600 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70 6c 65  ogEst(p->nSample
12610 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  ) - sqlite3LogEs
12620 74 28 6e 44 69 66 66 29 29 3b 0a 20 20 20 20 20  t(nDiff));.     
12630 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d 20   pLoop->nOut -= 
12640 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20 20 20 2a  nAdjust;.      *
12650 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  pbDone = 1;.    
12660 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
12670 30 2c 20 28 22 72 61 6e 67 65 20 73 6b 69 70 2d  0, ("range skip-
12680 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75  scan regions: %u
12690 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d 25 64 20  ..%u  adjust=%d 
126a0 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  est=%d\n",.     
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126c0 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20 6e 55        nLower, nU
126d0 70 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a 2d 31  pper, nAdjust*-1
126e0 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b  , pLoop->nOut));
126f0 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
12700 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 62  .    assert( *pb
12710 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  Done==0 );.  }..
12720 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
12730 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74 65  ee(p1);.  sqlite
12740 33 56 61 6c 75 65 46 72 65 65 28 70 32 29 3b 0a  3ValueFree(p2);.
12750 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
12760 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74  ee(pVal);..  ret
12770 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
12780 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
12790 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
127a0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
127b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
127c0 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
127d0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
127e0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73  that will be vis
127f0 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e  ited.** by scann
12800 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72  ing an index for
12810 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75   a range of valu
12820 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61  es. The range ma
12830 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a  y have an upper.
12840 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65  ** bound, a lowe
12850 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68  r bound, or both
12860 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  . The WHERE clau
12870 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65  se terms that se
12880 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61  t the upper.** a
12890 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20  nd lower bounds 
128a0 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20  are represented 
128b0 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  by pLower and pU
128c0 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c  pper respectivel
128d0 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  y. For.** exampl
128e0 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  e, assuming that
128f0 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74   index p is on t
12900 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  1(a):.**.**   ..
12910 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
12920 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
12930 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
12940 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f            |_____
12950 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20  |   |_____|.**  
12960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12970 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
12980 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12990 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20          pLower  
129a0 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49    pUpper.**.** I
129b0 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  f either of the 
129c0 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62  upper or lower b
129d0 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73  ound is not pres
129e0 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69  ent, then NULL i
129f0 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70  s passed in.** p
12a00 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72  lace of the corr
12a10 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54  esponding WhereT
12a20 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  erm..**.** The v
12a30 61 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64 65  alue in (pBuilde
12a40 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
12a50 2e 6e 45 71 29 20 69 73 20 74 68 65 20 69 6e 64  .nEq) is the ind
12a60 65 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a  ex of the index.
12a70 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63  ** column subjec
12a80 74 20 74 6f 20 74 68 65 20 72 61 6e 67 65 20 63  t to the range c
12a90 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65  onstraint. Or, e
12aa0 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65  quivalently, the
12ab0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71   number of.** eq
12ac0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
12ad0 74 73 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20  ts optimized by 
12ae0 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64  the proposed ind
12af0 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61  ex scan. For exa
12b00 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e  mple,.** assumin
12b10 67 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20  g index p is on 
12b20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68  t1(a, b), and th
12b30 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a  e SQL query is:.
12b40 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
12b50 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20   t1 WHERE a = ? 
12b60 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20  AND b > ? AND b 
12b70 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
12b80 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f  en nEq is set to
12b90 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67 65   1 (as the range
12ba0 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75   restricted colu
12bb0 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65 20 73 65  mn, b, is the se
12bc0 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  cond .** left-mo
12bd0 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
12be0 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20   index). Or, if 
12bf0 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  the query is:.**
12c00 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
12c10 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
12c20 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D a < ? ....**.*
12c30 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65  * then nEq is se
12c40 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68  t to 0..**.** Wh
12c50 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
12c60 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f   is called, *pnO
12c70 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ut is set to the
12c80 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 29   sqlite3LogEst()
12c90 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   of the.** numbe
12ca0 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 74  r of rows that t
12cb0 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73  he index scan is
12cc0 20 65 78 70 65 63 74 65 64 20 74 6f 20 76 69 73   expected to vis
12cd0 69 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20 63  it without .** c
12ce0 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20 72  onsidering the r
12cf0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
12d00 2e 20 49 66 20 6e 45 71 20 69 73 20 30 2c 20 74  . If nEq is 0, t
12d10 68 69 73 20 69 73 20 74 68 65 20 6e 75 6d 62 65  his is the numbe
12d20 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e  r of .** rows in
12d30 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73 73 75   the index. Assu
12d40 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63  ming no error oc
12d50 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20  curs, *pnOut is 
12d60 61 64 6a 75 73 74 65 64 20 28 72 65 64 75 63 65  adjusted (reduce
12d70 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74  d).** to account
12d80 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65 20 63   for the range c
12d90 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f 77 65  onstraints pLowe
12da0 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a  r and pUpper..**
12db0 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65   .** In the abse
12dc0 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  nce of sqlite_st
12dd0 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61 74 61  at4 ANALYZE data
12de0 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64 61 74  , or if such dat
12df0 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75  a cannot be.** u
12e00 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 72 61  sed, a single ra
12e10 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72  nge inequality r
12e20 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
12e30 68 20 73 70 61 63 65 20 62 79 20 61 20 66 61 63  h space by a fac
12e40 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e  tor of 4. .** an
12e50 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f 6e 73  d a pair of cons
12e60 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44  traints (x>? AND
12e70 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20 74 68   x<?) reduces th
12e80 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65  e expected numbe
12e90 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73  r of.** rows vis
12ea0 69 74 65 64 20 62 79 20 61 20 66 61 63 74 6f 72  ited by a factor
12eb0 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69   of 64..*/.stati
12ec0 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
12ed0 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
12ee0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
12ef0 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
12f00 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
12f10 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
12f20 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
12f30 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54 65 72  lder,.  WhereTer
12f40 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20  m *pLower,   /* 
12f50 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Lower bound on t
12f60 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
12f70 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e  >123" Might be N
12f80 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ULL */.  WhereTe
12f90 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a  rm *pUpper,   /*
12fa0 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Upper bound on 
12fb0 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
12fc0 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20  x<455" Might be 
12fd0 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c  NULL */.  WhereL
12fe0 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f  oop *pLoop     /
12ff0 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f  * Modify the .nO
13000 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e 72 52  ut and maybe .rR
13010 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a  un fields */.){.
13020 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13030 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74  E_OK;.  int nOut
13040 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a   = pLoop->nOut;.
13050 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a    LogEst nNew;..
13060 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
13070 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
13080 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  AT4.  Index *p =
13090 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
130a0 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45  pIndex;.  int nE
130b0 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
130c0 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70  ee.nEq;..  if( p
130d0 2d 3e 6e 53 61 6d 70 6c 65 3e 30 0a 20 20 20 26  ->nSample>0.   &
130e0 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65  & nEq<p->nSample
130f0 43 6f 6c 0a 20 20 20 26 26 20 4f 70 74 69 6d 69  Col.   && Optimi
13100 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50  zationEnabled(pP
13110 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
13120 5f 53 74 61 74 33 29 20 0a 20 20 29 7b 0a 20 20  _Stat3) .  ){.  
13130 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c    if( nEq==pBuil
13140 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29  der->nRecValid )
13150 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64  {.      Unpacked
13160 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
13170 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
13180 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32       tRowcnt a[2
13190 5d 3b 0a 20 20 20 20 20 20 75 38 20 61 66 66 3b  ];.      u8 aff;
131a0 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61  ..      /* Varia
131b0 62 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20  ble iLower will 
131c0 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73  be set to the es
131d0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
131e0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
131f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  .      ** the in
13200 64 65 78 20 74 68 61 74 20 61 72 65 20 6c 65 73  dex that are les
13210 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72  s than the lower
13220 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61   bound of the ra
13230 6e 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20  nge query. The. 
13240 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f       ** lower bo
13250 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f  und being the co
13260 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24  ncatenation of $
13270 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20  P and $L, where 
13280 24 50 20 69 73 20 74 68 65 0a 20 20 20 20 20 20  $P is the.      
13290 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f  ** key-prefix fo
132a0 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20  rmed by the nEq 
132b0 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61  values matched a
132c0 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c  gainst the nEq l
132d0 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a  eft-most.      *
132e0 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  * columns of the
132f0 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69   index, and $L i
13300 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  s the value in p
13310 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  Lower..      **.
13320 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20        ** Or, if 
13330 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f  pLower is NULL o
13340 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65  r $L cannot be e
13350 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74  xtracted from it
13360 20 28 62 65 63 61 75 73 65 20 69 74 0a 20 20 20   (because it.   
13370 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73     ** is not a s
13380 69 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f  imple variable o
13390 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29  r literal value)
133a0 2c 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  , the lower boun
133b0 64 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  d of the.      *
133c0 2a 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44  * range is $P. D
133d0 75 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e  ue to a quirk in
133e0 20 74 68 65 20 77 61 79 20 77 68 65 72 65 4b 65   the way whereKe
133f0 79 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20  yStats() works, 
13400 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66  even.      ** if
13410 20 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65   $L is available
13420 2c 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  , whereKeyStats(
13430 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  ) is called for 
13440 62 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20  both ($P) and . 
13450 20 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20       ** ($P:$L) 
13460 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f  and the larger o
13470 66 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e  f the two return
13480 65 64 20 76 61 6c 75 65 73 20 75 73 65 64 2e 0a  ed values used..
13490 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
134a0 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70  * Similarly, iUp
134b0 70 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74  per is to be set
134c0 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
134d0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
134e0 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20  f rows.      ** 
134f0 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75 70  less than the up
13500 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  per bound of the
13510 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68   range query. Wh
13520 65 72 65 20 74 68 65 20 75 70 70 65 72 20 62 6f  ere the upper bo
13530 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  und.      ** is 
13540 65 69 74 68 65 72 20 28 24 50 29 20 6f 72 20 28  either ($P) or (
13550 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20 65  $P:$U). Again, e
13560 76 65 6e 20 69 66 20 24 55 20 69 73 20 61 76 61  ven if $U is ava
13570 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76 61 6c  ilable, both val
13580 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ues.      ** of 
13590 69 55 70 70 65 72 20 61 72 65 20 72 65 71 75 65  iUpper are reque
135a0 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b 65 79  sted of whereKey
135b0 53 74 61 74 73 28 29 20 61 6e 64 20 74 68 65 20  Stats() and the 
135c0 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20  smaller used..  
135d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f      */.      tRo
135e0 77 63 6e 74 20 69 4c 6f 77 65 72 3b 0a 20 20 20  wcnt iLower;.   
135f0 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65     tRowcnt iUppe
13600 72 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 52  r;..      if( pR
13610 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  ec ){.        te
13620 73 74 63 61 73 65 28 20 70 52 65 63 2d 3e 6e 46  stcase( pRec->nF
13630 69 65 6c 64 21 3d 70 42 75 69 6c 64 65 72 2d 3e  ield!=pBuilder->
13640 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 20  nRecValid );.   
13650 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c       pRec->nFiel
13660 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  d = pBuilder->nR
13670 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 7d  ecValid;.      }
13680 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d 3d  .      if( nEq==
13690 70 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20  p->nKeyCol ){.  
136a0 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
136b0 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
136c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
136d0 20 20 20 20 20 61 66 66 20 3d 20 70 2d 3e 70 54       aff = p->pT
136e0 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
136f0 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66  Column[nEq]].aff
13700 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 7d 0a 20  inity;.      }. 
13710 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e       /* Determin
13720 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69 55 70  e iLower and iUp
13730 70 65 72 20 75 73 69 6e 67 20 28 24 50 29 20 6f  per using ($P) o
13740 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  nly. */.      if
13750 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20 20  ( nEq==0 ){.    
13760 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a      iLower = 0;.
13770 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20 3d          iUpper =
13780 20 70 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a 20 20   p->nRowEst0;.  
13790 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
137a0 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73     /* Note: this
137b0 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20 6f   call could be o
137c0 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20 2d 20  ptimized away - 
137d0 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65 20 76  since the same v
137e0 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20 20 20  alues must .    
137f0 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e      ** have been
13800 20 72 65 71 75 65 73 74 65 64 20 77 68 65 6e 20   requested when 
13810 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20 69  testing key $P i
13820 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  n whereEqualScan
13830 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20 20  Est().  */.     
13840 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73     whereKeyStats
13850 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
13860 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 20  , 0, a);.       
13870 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a   iLower = a[0];.
13880 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20 3d          iUpper =
13890 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20   a[0] + a[1];.  
138a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
138b0 65 72 74 28 20 70 4c 6f 77 65 72 3d 3d 30 20 7c  ert( pLower==0 |
138c0 7c 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72  | (pLower->eOper
138d0 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f  ator & (WO_GT|WO
138e0 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  _GE))!=0 );.    
138f0 20 20 61 73 73 65 72 74 28 20 70 55 70 70 65 72    assert( pUpper
13900 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e  ==0 || (pUpper->
13910 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
13920 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b  LT|WO_LE))!=0 );
13930 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13940 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
13950 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
13960 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 20  aSortOrder[nEq] 
13970 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
13980 65 20 72 6f 6c 65 73 20 6f 66 20 70 4c 6f 77 65  e roles of pLowe
13990 72 20 61 6e 64 20 70 55 70 70 65 72 20 61 72 65  r and pUpper are
139a0 20 73 77 61 70 70 65 64 20 66 6f 72 20 61 20 44   swapped for a D
139b0 45 53 43 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ESC index */.   
139c0 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54       SWAP(WhereT
139d0 65 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20 70 55  erm*, pLower, pU
139e0 70 70 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  pper);.      }..
139f0 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73        /* If poss
13a00 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e  ible, improve on
13a10 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73 74 69   the iLower esti
13a20 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24  mate using ($P:$
13a30 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  L). */.      if(
13a40 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20   pLower ){.     
13a50 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20     int bOk;     
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13a70 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65 20  * True if value 
13a80 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
13a90 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20  m pExpr */.     
13aa0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
13ab0 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e   pLower->pExpr->
13ac0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
13ad0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
13ae0 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70  4ProbeSetValue(p
13af0 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c  Parse, p, &pRec,
13b00 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71   pExpr, aff, nEq
13b10 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 20  , &bOk);.       
13b20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13b30 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20  OK && bOk ){.   
13b40 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69         tRowcnt i
13b50 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 77  New;.          w
13b60 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
13b70 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
13b80 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   a);.          i
13b90 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70  New = a[0] + ((p
13ba0 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
13bb0 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29   & (WO_GT|WO_LE)
13bc0 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20  ) ? a[1] : 0);. 
13bd0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
13be0 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65  w>iLower ) iLowe
13bf0 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  r = iNew;.      
13c00 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20      nOut--;.    
13c10 20 20 20 20 20 20 70 4c 6f 77 65 72 20 3d 20 30        pLower = 0
13c20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13c30 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
13c40 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f   possible, impro
13c50 76 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72  ve on the iUpper
13c60 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20   estimate using 
13c70 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20  ($P:$U). */.    
13c80 20 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a    if( pUpper ){.
13c90 20 20 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b          int bOk;
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cb0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76      /* True if v
13cc0 61 6c 75 65 20 69 73 20 65 78 74 72 61 63 74 65  alue is extracte
13cd0 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a  d from pExpr */.
13ce0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
13cf0 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45  xpr = pUpper->pE
13d00 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
13d10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13d20 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
13d30 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
13d40 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66  pRec, pExpr, aff
13d50 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20  , nEq, &bOk);.  
13d60 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
13d70 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29  LITE_OK && bOk )
13d80 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77  {.          tRow
13d90 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  cnt iNew;.      
13da0 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74      whereKeyStat
13db0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
13dc0 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 1, a);.      
13dd0 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20      iNew = a[0] 
13de0 2b 20 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  + ((pUpper->eOpe
13df0 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57  rator & (WO_GT|W
13e00 4f 5f 4c 45 29 29 20 3f 20 61 5b 31 5d 20 3a 20  O_LE)) ? a[1] : 
13e10 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
13e20 28 20 69 4e 65 77 3c 69 55 70 70 65 72 20 29 20  ( iNew<iUpper ) 
13e30 69 55 70 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20  iUpper = iNew;. 
13e40 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b           nOut--;
13e50 0a 20 20 20 20 20 20 20 20 20 20 70 55 70 70 65  .          pUppe
13e60 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  r = 0;.        }
13e70 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
13e80 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
13e90 20 70 52 65 63 3b 0a 20 20 20 20 20 20 69 66 28   pRec;.      if(
13ea0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13eb0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 55  {.        if( iU
13ec0 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20  pper>iLower ){. 
13ed0 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20           nNew = 
13ee0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55  sqlite3LogEst(iU
13ef0 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a  pper - iLower);.
13f00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
13f10 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20           nNew = 
13f20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73 65 72  10;        asser
13f30 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 10==sqlite3Lo
13f40 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20  gEst(2) );.     
13f50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
13f60 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20 20   nNew<nOut ){.  
13f70 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e          nOut = n
13f80 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  New;.        }. 
13f90 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
13fa0 45 28 30 78 31 30 2c 20 28 22 53 54 41 54 34 20  E(0x10, ("STAT4 
13fb0 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75 2e 2e  range scan: %u..
13fc0 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20  %u  est=%d\n",. 
13fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fe0 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29 69            (u32)i
13ff0 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70 70  Lower, (u32)iUpp
14000 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20 20  er, nOut));.    
14010 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
14020 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d       int bDone =
14030 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   0;.      rc = w
14040 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61  hereRangeSkipSca
14050 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 4c 6f  nEst(pParse, pLo
14060 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70 4c 6f  wer, pUpper, pLo
14070 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20 20 20  op, &bDone);.   
14080 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29 20 72     if( bDone ) r
14090 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
140a0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53    }.#else.  UNUS
140b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61  ED_PARAMETER(pPa
140c0 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rse);.  UNUSED_P
140d0 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c 64 65  ARAMETER(pBuilde
140e0 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  r);.  assert( pL
140f0 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29  ower || pUpper )
14100 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
14110 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20  t( pUpper==0 || 
14120 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61 67 73  (pUpper->wtFlags
14130 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
14140 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68  0 );.  nNew = wh
14150 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70  ereRangeAdjust(p
14160 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20 20  Lower, nOut);.  
14170 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e 67  nNew = whereRang
14180 65 41 64 6a 75 73 74 28 70 55 70 70 65 72 2c 20  eAdjust(pUpper, 
14190 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e  nNew);..  /* TUN
141a0 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69 73  ING: If there is
141b0 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61   both an upper a
141c0 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74 2c 20  nd lower limit, 
141d0 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65  assume the range
141e0 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64   is.  ** reduced
141f0 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61   by an additiona
14200 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e  l 75%. This mean
14210 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61 75  s that, by defau
14220 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65  lt, an open-ende
14230 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65  d.  ** range que
14240 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f  ry (e.g. col > ?
14250 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ) is assumed to 
14260 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65  match 1/4 of the
14270 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a   rows in the.  *
14280 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61  * index. While a
14290 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65   closed range (e
142a0 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20  .g. col BETWEEN 
142b0 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69  ? AND ?) is esti
142c0 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61  mated to.  ** ma
142d0 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20  tch 1/64 of the 
142e0 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28  index. */ .  if(
142f0 20 70 4c 6f 77 65 72 20 26 26 20 70 55 70 70 65   pLower && pUppe
14300 72 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a  r ) nNew -= 20;.
14310 0a 20 20 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f 77  .  nOut -= (pLow
14320 65 72 21 3d 30 29 20 2b 20 28 70 55 70 70 65 72  er!=0) + (pUpper
14330 21 3d 30 29 3b 0a 20 20 69 66 28 20 6e 4e 65 77  !=0);.  if( nNew
14340 3c 31 30 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b  <10 ) nNew = 10;
14350 0a 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74  .  if( nNew<nOut
14360 20 29 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a   ) nOut = nNew;.
14370 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45 52  #if defined(WHER
14380 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a  ETRACE_ENABLED).
14390 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75    if( pLoop->nOu
143a0 74 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 57 48  t>nOut ){.    WH
143b0 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22  ERETRACE(0x10,("
143c0 52 61 6e 67 65 20 73 63 61 6e 20 6c 6f 77 65 72  Range scan lower
143d0 73 20 6e 4f 75 74 20 66 72 6f 6d 20 25 64 20 74  s nOut from %d t
143e0 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  o %d\n",.       
143f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
14400 6f 70 2d 3e 6e 4f 75 74 2c 20 6e 4f 75 74 29 29  op->nOut, nOut))
14410 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
14420 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f  Loop->nOut = (Lo
14430 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74  gEst)nOut;.  ret
14440 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
14450 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
14460 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
14470 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
14480 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
14490 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
144a0 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a  turned based on.
144b0 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63  ** an equality c
144c0 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55  onstraint x=VALU
144d0 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61 74  E and where that
144e0 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e   VALUE occurs in
144f0 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61  .** the histogra
14500 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e  m data.  This on
14510 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20  ly works when x 
14520 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  is the left-most
14530 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  .** column of an
14540 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74   index and sqlit
14550 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72 61  e_stat3 histogra
14560 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61  m data is availa
14570 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20  ble.** for that 
14580 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78  index.  When pEx
14590 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  pr==NULL that me
145a0 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69  ans the constrai
145b0 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e  nt is.** "x IS N
145c0 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20  ULL" instead of 
145d0 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a  "x=VALUE"..**.**
145e0 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d   Write the estim
145f0 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69  ated row count i
14600 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72  nto *pnRow and r
14610 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
14620 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74   .** If unable t
14630 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61  o make an estima
14640 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77  te, leave *pnRow
14650 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72   unchanged and r
14660 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
14670 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  o..**.** This ro
14680 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69  utine can fail i
14690 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74  f it is unable t
146a0 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69  o load a collati
146b0 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72  ng sequence.** r
146c0 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69  equired for stri
146d0 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f  ng comparison, o
146e0 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61  r if unable to a
146f0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a  llocate memory.*
14700 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76  * for a UTF conv
14710 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ersion required 
14720 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  for comparison. 
14730 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74   The error is st
14740 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ored.** in the p
14750 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
14760 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
14770 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
14780 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
14790 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
147a0 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
147b0 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
147c0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
147d0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
147e0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
147f0 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
14800 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e  ion for VALUE in
14810 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e   the x=VALUE con
14820 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f  straint */.  tRo
14830 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20  wcnt *pnRow     
14840 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
14850 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d  evised row estim
14860 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ate here */.){. 
14870 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69   Index *p = pBui
14880 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
14890 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
148a0 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65 72  t nEq = pBuilder
148b0 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
148c0 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  nEq;.  UnpackedR
148d0 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42  ecord *pRec = pB
148e0 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20  uilder->pRec;.  
148f0 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  u8 aff;         
14900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
14910 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  umn affinity */.
14920 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
14930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
14940 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
14950 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
14960 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20  cnt a[2];       
14970 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74        /* Statist
14980 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b  ics */.  int bOk
14990 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71  ;..  assert( nEq
149a0 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
149b0 20 6e 45 71 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e   nEq<=p->nColumn
149c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
149d0 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20  >aSample!=0 );. 
149e0 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d   assert( p->nSam
149f0 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ple>0 );.  asser
14a00 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  t( pBuilder->nRe
14a10 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a 20  cValid<nEq );.. 
14a20 20 2f 2a 20 49 66 20 76 61 6c 75 65 73 20 61 72   /* If values ar
14a30 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  e not available 
14a40 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f  for all fields o
14a50 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 74  f the index to t
14a60 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20  he left.  ** of 
14a70 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65 73 74  this one, no est
14a80 69 6d 61 74 65 20 63 61 6e 20 62 65 20 6d 61 64  imate can be mad
14a90 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  e. Return SQLITE
14aa0 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20  _NOTFOUND. */.  
14ab0 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  if( pBuilder->nR
14ac0 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31 29 20  ecValid<(nEq-1) 
14ad0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14ae0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
14af0 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73   }..  /* This is
14b00 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
14b10 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c 6c 20   only. The call 
14b20 74 6f 20 73 71 6c 69 74 65 33 53 74 61 74 34 50  to sqlite3Stat4P
14b30 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29 0a 20  robeSetValue(). 
14b40 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c 64 20   ** below would 
14b50 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
14b60 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66 28  value.  */.  if(
14b70 20 6e 45 71 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e   nEq>=p->nColumn
14b80 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d   ){.    *pnRow =
14b90 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
14ba0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
14bb0 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65   aff = p->pTable
14bc0 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75  ->aCol[p->aiColu
14bd0 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61 66 66 69 6e  mn[nEq-1]].affin
14be0 69 74 79 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ity;.  rc = sqli
14bf0 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
14c00 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
14c10 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61   &pRec, pExpr, a
14c20 66 66 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29  ff, nEq-1, &bOk)
14c30 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52  ;.  pBuilder->pR
14c40 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28  ec = pRec;.  if(
14c50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14c60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
14c70 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72  ( bOk==0 ) retur
14c80 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
14c90 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  D;.  pBuilder->n
14ca0 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a  RecValid = nEq;.
14cb0 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  .  whereKeyStats
14cc0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
14cd0 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45  , 0, a);.  WHERE
14ce0 54 52 41 43 45 28 30 78 31 30 2c 28 22 65 71 75  TRACE(0x10,("equ
14cf0 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f  ality scan regio
14d00 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29  ns: %d\n", (int)
14d10 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77  a[1]));.  *pnRow
14d20 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65   = a[1];.  .  re
14d30 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
14d40 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
14d50 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
14d60 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  4 */..#ifdef SQL
14d70 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
14d80 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  _OR_STAT4./*.** 
14d90 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  Estimate the num
14da0 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
14db0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
14dc0 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e  d based on.** an
14dd0 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77   IN constraint w
14de0 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68  here the right-h
14df0 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
14e00 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69  IN operator.** i
14e10 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75  s a list of valu
14e20 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  es.  Example:.**
14e30 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52 45  .**        WHERE
14e40 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a   x IN (1,2,3,4).
14e50 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
14e60 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f  estimated row co
14e70 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20  unt into *pnRow 
14e80 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
14e90 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61  E_OK. .** If una
14ea0 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65  ble to make an e
14eb0 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a  stimate, leave *
14ec0 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20  pnRow unchanged 
14ed0 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
14ee0 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-zero..**.** Th
14ef0 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66  is routine can f
14f00 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61  ail if it is una
14f10 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f  ble to load a co
14f20 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
14f30 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72  .** required for
14f40 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73   string comparis
14f50 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65  on, or if unable
14f60 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
14f70 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46  ory.** for a UTF
14f80 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75   conversion requ
14f90 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  ired for compari
14fa0 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20  son.  The error 
14fb0 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  is stored.** in 
14fc0 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
14fd0 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
14fe0 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45  int whereInScanE
14ff0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
15000 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
15010 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
15020 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
15030 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
15040 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
15050 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
15060 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76  st,     /* The v
15070 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65  alue list on the
15080 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76   RHS of "x IN (v
15090 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f  1,v2,v3,...)" */
150a0 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f  .  tRowcnt *pnRo
150b0 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  w       /* Write
150c0 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77   the revised row
150d0 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a   estimate here *
150e0 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  /.){.  Index *p 
150f0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
15100 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
15110 3b 0a 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20  ;.  i64 nRow0 = 
15120 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49  sqlite3LogEstToI
15130 6e 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  nt(p->aiRowLogEs
15140 74 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65  t[0]);.  int nRe
15150 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65  cValid = pBuilde
15160 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20  r->nRecValid;.  
15170 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15180 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75  OK;     /* Subfu
15190 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f  nction return co
151a0 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  de */.  tRowcnt 
151b0 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  nEst;           
151c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* Number of row
151d0 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
151e0 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  erm */.  tRowcnt
151f0 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20   nRowEst = 0;   
15200 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65   /* New estimate
15210 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
15220 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20  f rows */.  int 
15230 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
15240 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
15250 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
15260 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
15270 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  );.  for(i=0; rc
15280 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
15290 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
152a0 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20  ++){.    nEst = 
152b0 6e 52 6f 77 30 3b 0a 20 20 20 20 72 63 20 3d 20  nRow0;.    rc = 
152c0 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
152d0 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
152e0 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  er, pList->a[i].
152f0 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20  pExpr, &nEst);. 
15300 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45     nRowEst += nE
15310 73 74 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72  st;.    pBuilder
15320 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52  ->nRecValid = nR
15330 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20  ecValid;.  }..  
15340 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15350 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f  K ){.    if( nRo
15360 77 45 73 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e  wEst > nRow0 ) n
15370 52 6f 77 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a  RowEst = nRow0;.
15380 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f      *pnRow = nRo
15390 77 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54  wEst;.    WHERET
153a0 52 41 43 45 28 30 78 31 30 2c 28 22 49 4e 20 72  RACE(0x10,("IN r
153b0 6f 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74  ow estimate: est
153c0 3d 25 64 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29  =%d\n", nRowEst)
153d0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
153e0 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
153f0 61 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20  alid==nRecValid 
15400 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15410 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
15420 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
15430 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  OR_STAT4 */../*.
15440 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72  ** Disable a ter
15450 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
15460 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20  lause.  Except, 
15470 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74  do not disable t
15480 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74  he term.** if it
15490 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54   controls a LEFT
154a0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20   OUTER JOIN and 
154b0 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69  it did not origi
154c0 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a  nate in the ON.*
154d0 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  * or USING claus
154e0 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a  e of that join..
154f0 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74  **.** Consider t
15500 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b  he term t2.z='ok
15510 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ' in the followi
15520 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a  ng queries:.**.*
15530 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20  *   (1)  SELECT 
15540 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
15550 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
15560 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27  2.x WHERE t2.z='
15570 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45  ok'.**   (2)  SE
15580 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
15590 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
155a0 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
155b0 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20  z='ok'.**   (3) 
155c0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
155d0 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61  1, t2 WHERE t1.a
155e0 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
155f0 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32  ok'.**.** The t2
15600 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62  .z='ok' is disab
15610 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32  led in the in (2
15620 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69  ) because it ori
15630 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68  ginates.** in th
15640 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68  e ON clause.  Th
15650 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c  e term is disabl
15660 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73  ed in (3) becaus
15670 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74  e it is not part
15680 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  .** of a LEFT OU
15690 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31  TER JOIN.  In (1
156a0 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e  ), the term is n
156b0 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a  ot disabled..**.
156c0 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74  ** Disabling a t
156d0 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20  erm causes that 
156e0 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74  term to not be t
156f0 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e  ested in the inn
15700 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68  er loop.** of th
15710 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69  e join.  Disabli
15720 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ng is an optimiz
15730 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72  ation.  When ter
15740 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64  ms are satisfied
15750 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20  .** by indices, 
15760 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20  we disable them 
15770 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e  to prevent redun
15780 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68  dant tests in th
15790 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e  e inner.** loop.
157a0 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74    We would get t
157b0 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c  he correct resul
157c0 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65  ts if nothing we
157d0 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64  re ever disabled
157e0 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d  ,.** but joins m
157f0 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c  ight run a littl
15800 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74  e slower.  The t
15810 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62  rick is to disab
15820 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73  le as much.** as
15830 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20   we can without 
15840 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75  disabling too mu
15850 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62  ch.  If we disab
15860 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64  led in (1), we'd
15870 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e   get.** the wron
15880 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74  g answer.  See t
15890 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73  icket #813..*/.s
158a0 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62  tatic void disab
158b0 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65  leTerm(WhereLeve
158c0 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65  l *pLevel, Where
158d0 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20  Term *pTerm){.  
158e0 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20  if( pTerm.      
158f0 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  && (pTerm->wtFla
15900 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
15910 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c  ==0.      && (pL
15920 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d  evel->iLeftJoin=
15930 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  =0 || ExprHasPro
15940 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
15950 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
15960 29 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76  ).      && (pLev
15970 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 26 20 70  el->notReady & p
15980 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 29  Term->prereqAll)
15990 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 54 65  ==0.  ){.    pTe
159a0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
159b0 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69  ERM_CODED;.    i
159c0 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  f( pTerm->iParen
159d0 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68  t>=0 ){.      Wh
159e0 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20  ereTerm *pOther 
159f0 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61  = &pTerm->pWC->a
15a00 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d  [pTerm->iParent]
15a10 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70  ;.      if( (--p
15a20 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d  Other->nChild)==
15a30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  0 ){.        dis
15a40 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
15a50 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20   pOther);.      
15a60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
15a70 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
15a80 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20  Affinity opcode 
15a90 74 6f 20 61 70 70 6c 79 20 74 68 65 20 63 6f 6c  to apply the col
15aa0 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72  umn affinity str
15ab0 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74  ing zAff.** to t
15ac0 68 65 20 6e 20 72 65 67 69 73 74 65 72 73 20 73  he n registers s
15ad0 74 61 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e  tarting at base.
15ae0 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f 70   .**.** As an op
15af0 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53 51 4c 49  timization, SQLI
15b00 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72  TE_AFF_NONE entr
15b10 69 65 73 20 28 77 68 69 63 68 20 61 72 65 20 6e  ies (which are n
15b20 6f 2d 6f 70 73 29 20 61 74 20 74 68 65 0a 2a 2a  o-ops) at the.**
15b30 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65   beginning and e
15b40 6e 64 20 6f 66 20 7a 41 66 66 20 61 72 65 20 69  nd of zAff are i
15b50 67 6e 6f 72 65 64 2e 20 20 49 66 20 61 6c 6c 20  gnored.  If all 
15b60 65 6e 74 72 69 65 73 20 69 6e 20 7a 41 66 66 20  entries in zAff 
15b70 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  are.** SQLITE_AF
15b80 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f 20  F_NONE, then no 
15b90 63 6f 64 65 20 67 65 74 73 20 67 65 6e 65 72 61  code gets genera
15ba0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
15bb0 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74  routine makes it
15bc0 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 7a 41  s own copy of zA
15bd0 66 66 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ff so that the c
15be0 61 6c 6c 65 72 20 69 73 20 66 72 65 65 0a 2a 2a  aller is free.**
15bf0 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41 66 66 20   to modify zAff 
15c00 61 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  after this routi
15c10 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73  ne returns..*/.s
15c20 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41  tatic void codeA
15c30 70 70 6c 79 41 66 66 69 6e 69 74 79 28 50 61 72  pplyAffinity(Par
15c40 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
15c50 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61  base, int n, cha
15c60 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62 65  r *zAff){.  Vdbe
15c70 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
15c80 64 62 65 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d  dbe;.  if( zAff=
15c90 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
15ca0 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
15cb0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
15cc0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
15cd0 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
15ce0 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20 62 61 73  .  /* Adjust bas
15cf0 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b 69 70 20  e and n to skip 
15d00 6f 76 65 72 20 53 51 4c 49 54 45 5f 41 46 46 5f  over SQLITE_AFF_
15d10 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 61 74 20  NONE entries at 
15d20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
15d30 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66 20 74 68  ** and end of th
15d40 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
15d50 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  g..  */.  while(
15d60 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b 30 5d 3d   n>0 && zAff[0]=
15d70 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
15d80 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20   ){.    n--;.   
15d90 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20 7a 41 66   base++;.    zAf
15da0 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  f++;.  }.  while
15db0 28 20 6e 3e 31 20 26 26 20 7a 41 66 66 5b 6e 2d  ( n>1 && zAff[n-
15dc0 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  1]==SQLITE_AFF_N
15dd0 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a  ONE ){.    n--;.
15de0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74    }..  /* Code t
15df0 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  he OP_Affinity o
15e00 70 63 6f 64 65 20 69 66 20 74 68 65 72 65 20 69  pcode if there i
15e10 73 20 61 6e 79 74 68 69 6e 67 20 6c 65 66 74 20  s anything left 
15e20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69 66 28 20  to do. */.  if( 
15e30 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  n>0 ){.    sqlit
15e40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15e50 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73  OP_Affinity, bas
15e60 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, n);.    sqlit
15e70 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
15e80 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a  , -1, zAff, n);.
15e90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15ea0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
15eb0 67 65 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c  ge(pParse, base,
15ec0 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a   n);.  }.}.../*.
15ed0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
15ee0 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71   for a single eq
15ef0 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74  uality term of t
15f00 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
15f10 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a    An equality.**
15f20 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74   term can be eit
15f30 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20  her X=expr or X 
15f40 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72  IN (...).   pTer
15f50 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f  m is the term to
15f60 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a   be .** coded..*
15f70 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74  *.** The current
15f80 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63   value for the c
15f90 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66  onstraint is lef
15fa0 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52  t in register iR
15fb0 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  eg..**.** For a 
15fc0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68  constraint of th
15fd0 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74  e form X=expr, t
15fe0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
15ff0 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69   evaluated and i
16000 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20  ts.** result is 
16010 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63  left on the stac
16020 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69  k.  For constrai
16030 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  nts of the form 
16040 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68  X IN (...).** th
16050 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
16060 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77  up a loop that w
16070 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72  ill iterate over
16080 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58   all values of X
16090 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
160a0 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
160b0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
160c0 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  e,      /* The p
160d0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
160e0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
160f0 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74  Term,   /* The t
16100 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
16110 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f   clause to be co
16120 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ded */.  WhereLe
16130 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20  vel *pLevel, /* 
16140 54 68 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  The level of the
16150 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20   FROM clause we 
16160 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
16170 2f 0a 20 20 69 6e 74 20 69 45 71 2c 20 20 20 20  /.  int iEq,    
16180 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
16190 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79   of the equality
161a0 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 69   term within thi
161b0 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74  s level */.  int
161c0 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20   bRev,          
161d0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 72 65 76   /* True for rev
161e0 65 72 73 65 2d 6f 72 64 65 72 20 49 4e 20 6f 70  erse-order IN op
161f0 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  erations */.  in
16200 74 20 69 54 61 72 67 65 74 20 20 20 20 20 20 20  t iTarget       
16210 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20    /* Attempt to 
16220 6c 65 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e  leave results in
16230 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
16240 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20  /.){.  Expr *pX 
16250 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
16260 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
16270 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
16280 20 69 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   iReg;          
16290 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
162a0 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ter holding resu
162b0 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lts */..  assert
162c0 28 20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20  ( iTarget>0 );. 
162d0 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
162e0 45 51 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d  EQ ){.    iReg =
162f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16300 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
16310 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67  X->pRight, iTarg
16320 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  et);.  }else if(
16330 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55   pX->op==TK_ISNU
16340 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d  LL ){.    iReg =
16350 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71   iTarget;.    sq
16360 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16370 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
16380 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Reg);.#ifndef SQ
16390 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
163a0 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  RY.  }else{.    
163b0 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69  int eType;.    i
163c0 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72  nt iTab;.    str
163d0 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
163e0 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
163f0 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
16400 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 69 66 28  pWLoop;..    if(
16410 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
16420 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
16430 54 41 42 4c 45 29 3d 3d 30 0a 20 20 20 20 20 20  TABLE)==0.      
16440 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  && pLoop->u.btre
16450 65 2e 70 49 6e 64 65 78 21 3d 30 0a 20 20 20 20  e.pIndex!=0.    
16460 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74    && pLoop->u.bt
16470 72 65 65 2e 70 49 6e 64 65 78 2d 3e 61 53 6f 72  ree.pIndex->aSor
16480 74 4f 72 64 65 72 5b 69 45 71 5d 0a 20 20 20 20  tOrder[iEq].    
16490 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
164a0 65 28 20 69 45 71 3d 3d 30 20 29 3b 0a 20 20 20  e( iEq==0 );.   
164b0 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65     testcase( bRe
164c0 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20  v );.      bRev 
164d0 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20  = !bRev;.    }. 
164e0 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
164f0 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20  p==TK_IN );.    
16500 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a  iReg = iTarget;.
16510 20 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69      eType = sqli
16520 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70  te3FindInIndex(p
16530 50 61 72 73 65 2c 20 70 58 2c 20 49 4e 5f 49 4e  Parse, pX, IN_IN
16540 44 45 58 5f 4c 4f 4f 50 2c 20 30 29 3b 0a 20 20  DEX_LOOP, 0);.  
16550 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
16560 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
16570 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
16580 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20  se( bRev );.    
16590 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a    bRev = !bRev;.
165a0 20 20 20 20 7d 0a 20 20 20 20 69 54 61 62 20 3d      }.    iTab =
165b0 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20   pX->iTable;.   
165c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
165d0 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  p2(v, bRev ? OP_
165e0 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
165f0 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , iTab, 0);.    
16600 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
16610 2c 20 62 52 65 76 29 3b 0a 20 20 20 20 56 64 62  , bRev);.    Vdb
16620 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 21  eCoverageIf(v, !
16630 62 52 65 76 29 3b 0a 20 20 20 20 61 73 73 65 72  bRev);.    asser
16640 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
16650 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
16660 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  _OR)==0 );.    p
16670 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
16680 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a   WHERE_IN_ABLE;.
16690 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
166a0 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20  u.in.nIn==0 ){. 
166b0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64       pLevel->add
166c0 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  rNxt = sqlite3Vd
166d0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
166e0 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
166f0 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20  ->u.in.nIn++;.  
16700 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61    pLevel->u.in.a
16710 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20  InLoop =.       
16720 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
16730 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  OrFree(pParse->d
16740 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  b, pLevel->u.in.
16750 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  aInLoop,.       
16760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16770 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c         sizeof(pL
16780 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
16790 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75  op[0])*pLevel->u
167a0 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49  .in.nIn);.    pI
167b0 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  n = pLevel->u.in
167c0 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  .aInLoop;.    if
167d0 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70  ( pIn ){.      p
167e0 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e  In += pLevel->u.
167f0 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20  in.nIn - 1;.    
16800 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54    pIn->iCur = iT
16810 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  ab;.      if( eT
16820 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
16830 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  WID ){.        p
16840 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20  In->addrInTop = 
16850 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16860 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
16870 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Tab, iReg);.    
16880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16890 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20   pIn->addrInTop 
168a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
168b0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
168c0 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29  , iTab, 0, iReg)
168d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
168e0 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20  pIn->eEndLoopOp 
168f0 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
16900 49 66 4f 70 65 6e 20 3a 20 4f 50 5f 4e 65 78 74  IfOpen : OP_Next
16910 49 66 4f 70 65 6e 3b 0a 20 20 20 20 20 20 73 71  IfOpen;.      sq
16920 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16930 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52  v, OP_IsNull, iR
16940 65 67 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  eg); VdbeCoverag
16950 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(v);.    }else{
16960 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75  .      pLevel->u
16970 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20  .in.nIn = 0;.   
16980 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
16990 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
169a0 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65  el, pTerm);.  re
169b0 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a  turn iReg;.}../*
169c0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
169d0 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
169e0 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20  uate all == and 
169f0 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  IN constraints f
16a00 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 73  or an.** index s
16a10 63 61 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  can..**.** For e
16a20 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72  xample, consider
16a30 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c   table t1(a,b,c,
16a40 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65  d,e,f) with inde
16a50 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20  x i1(a,b,c)..** 
16a60 53 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52  Suppose the WHER
16a70 45 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73  E clause is this
16a80 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e  :  a==5 AND b IN
16a90 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35   (1,2,3) AND c>5
16aa0 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65   AND c<10.** The
16ab0 20 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61   index has as ma
16ac0 6e 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61  ny as three equa
16ad0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
16ae0 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a  , but in this.**
16af0 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68   example, the th
16b00 69 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73  ird "c" value is
16b10 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20   an inequality. 
16b20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a   So only two .**
16b30 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
16b40 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f   coded.  This ro
16b50 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72  utine will gener
16b60 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
16b70 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64  uate.** a==5 and
16b80 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20   b IN (1,2,3).  
16b90 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
16ba0 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77  es for a and b w
16bb0 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a  ill be stored.**
16bc0 20 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20   in consecutive 
16bd0 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
16be0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66  e index of the f
16bf0 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 73  irst register is
16c00 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
16c10 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   In the example 
16c20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42  above nEq==2.  B
16c30 75 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  ut this subrouti
16c40 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  ne works for any
16c50 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71   value.** of nEq
16c60 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49   including 0.  I
16c70 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72  f nEq==0, this r
16c80 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79  outine is nearly
16c90 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65   a no-op..** The
16ca0 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64   only thing it d
16cb0 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20  oes is allocate 
16cc0 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  the pLevel->iMem
16cd0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
16ce0 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20  .** compute the 
16cf0 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e  affinity string.
16d00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72  .**.** The nExtr
16d10 61 52 65 67 20 70 61 72 61 6d 65 74 65 72 20 69  aReg parameter i
16d20 73 20 30 20 6f 72 20 31 2e 20 20 49 74 20 69 73  s 0 or 1.  It is
16d30 20 30 20 69 66 20 61 6c 6c 20 57 48 45 52 45 20   0 if all WHERE 
16d40 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
16d50 74 73 0a 2a 2a 20 61 72 65 20 3d 3d 20 6f 72 20  ts.** are == or 
16d60 49 4e 20 61 6e 64 20 61 72 65 20 63 6f 76 65 72  IN and are cover
16d70 65 64 20 62 79 20 74 68 65 20 6e 45 71 2e 20 20  ed by the nEq.  
16d80 6e 45 78 74 72 61 52 65 67 20 69 73 20 31 20 69  nExtraReg is 1 i
16d90 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  f there is.** an
16da0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
16db0 74 72 61 69 6e 74 20 28 73 75 63 68 20 61 73 20  traint (such as 
16dc0 74 68 65 20 22 63 3e 3d 35 20 41 4e 44 20 63 3c  the "c>=5 AND c<
16dd0 31 30 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70  10" in the examp
16de0 6c 65 29 20 74 68 61 74 0a 2a 2a 20 6f 63 63 75  le) that.** occu
16df0 72 73 20 61 66 74 65 72 20 74 68 65 20 6e 45 71  rs after the nEq
16e00 20 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61   quality constra
16e10 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ints..**.** This
16e20 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
16e30 65 73 20 61 20 72 61 6e 67 65 20 6f 66 20 6e 45  es a range of nE
16e40 71 2b 6e 45 78 74 72 61 52 65 67 20 6d 65 6d 6f  q+nExtraReg memo
16e50 72 79 20 63 65 6c 6c 73 20 61 6e 64 20 72 65 74  ry cells and ret
16e60 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65  urns.** the inde
16e70 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6d  x of the first m
16e80 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74 68  emory cell in th
16e90 61 74 20 72 61 6e 67 65 2e 20 54 68 65 20 63 6f  at range. The co
16ea0 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73  de that.** calls
16eb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
16ec0 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f  ll use that memo
16ed0 72 79 20 72 61 6e 67 65 20 74 6f 20 73 74 6f 72  ry range to stor
16ee0 65 20 6b 65 79 73 20 66 6f 72 0a 2a 2a 20 73 74  e keys for.** st
16ef0 61 72 74 20 61 6e 64 20 74 65 72 6d 69 6e 61 74  art and terminat
16f00 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f  ion conditions o
16f10 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 20 6b  f the loop..** k
16f20 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
16f30 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72  loop.  If one or
16f40 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f   more IN operato
16f50 72 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a  rs appear, then.
16f60 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
16f70 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64  allocates an add
16f80 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f  itional nEq memo
16f90 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74  ry cells for int
16fa0 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a  ernal.** use..**
16fb0 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
16fc0 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73 20  ning, *pzAff is 
16fd0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
16fe0 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
16ff0 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66  ing a.** copy of
17000 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
17010 6e 69 74 79 20 73 74 72 69 6e 67 20 6f 66 20 74  nity string of t
17020 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74  he index allocat
17030 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  ed using.** sqli
17040 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45  te3DbMalloc(). E
17050 78 63 65 70 74 2c 20 65 6e 74 72 69 65 73 20 69  xcept, entries i
17060 6e 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68  n the copy of th
17070 65 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61  e string associa
17080 74 65 64 0a 2a 2a 20 77 69 74 68 20 65 71 75 61  ted.** with equa
17090 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
170a0 20 74 68 61 74 20 75 73 65 20 4e 4f 4e 45 20 61   that use NONE a
170b0 66 66 69 6e 69 74 79 20 61 72 65 20 73 65 74 20  ffinity are set 
170c0 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  to.** SQLITE_AFF
170d0 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73 20 74  _NONE. This is t
170e0 6f 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c 20  o deal with SQL 
170f0 73 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c  such as the foll
17100 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  owing:.**.**   C
17110 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
17120 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45   TEXT PRIMARY KE
17130 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45  Y, b);.**   SELE
17140 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41  CT ... FROM t1 A
17150 53 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74  S t2, t1 WHERE t
17160 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a  1.a = t2.b;.**.*
17170 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  * In the example
17180 20 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64 65   above, the inde
17190 78 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20 54  x on t1(a) has T
171a0 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42 75  EXT affinity. Bu
171b0 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72  t since.** the r
171c0 69 67 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f  ight hand side o
171d0 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63  f the equality c
171e0 6f 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62 29  onstraint (t2.b)
171f0 20 68 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e 69   has NONE affini
17200 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72  ty,.** no conver
17210 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61  sion should be a
17220 74 74 65 6d 70 74 65 64 20 62 65 66 6f 72 65 20  ttempted before 
17230 75 73 69 6e 67 20 61 20 74 32 2e 62 20 76 61 6c  using a t2.b val
17240 75 65 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a  ue as part of.**
17250 20 61 20 6b 65 79 20 74 6f 20 73 65 61 72 63 68   a key to search
17260 20 74 68 65 20 69 6e 64 65 78 2e 20 48 65 6e 63   the index. Henc
17270 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  e the first byte
17280 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   in the returned
17290 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72   affinity.** str
172a0 69 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d  ing in this exam
172b0 70 6c 65 20 77 6f 75 6c 64 20 62 65 20 73 65 74  ple would be set
172c0 20 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   to SQLITE_AFF_N
172d0 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ONE..*/.static i
172e0 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69  nt codeAllEquali
172f0 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65  tyTerms(.  Parse
17300 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
17310 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
17320 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ext */.  WhereLe
17330 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f  vel *pLevel,   /
17340 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c  * Which nested l
17350 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  oop of the FROM 
17360 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f  we are coding */
17370 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20  .  int bRev,    
17380 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 76 65           /* Reve
17390 72 73 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  rse the order of
173a0 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f   IN operators */
173b0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67  .  int nExtraReg
173c0 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ,        /* Numb
173d0 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69  er of extra regi
173e0 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
173f0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  e */.  char **pz
17400 41 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Aff          /* 
17410 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e  OUT: Set to poin
17420 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73 74  t to affinity st
17430 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75 31 36  ring */.){.  u16
17440 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20   nEq;           
17450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17460 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  e number of == o
17470 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  r IN constraints
17480 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31   to code */.  u1
17490 36 20 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20  6 nSkip;        
174a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
174b0 75 6d 62 65 72 20 6f 66 20 6c 65 66 74 2d 6d 6f  umber of left-mo
174c0 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 73 6b  st columns to sk
174d0 69 70 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ip */.  Vdbe *v 
174e0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
174f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20        /* The vm 
17500 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
17510 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  on */.  Index *p
17520 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
17530 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
17540 65 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  ex being used fo
17550 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20  r this loop */. 
17560 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
17570 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
17580 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74  * A single const
17590 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  raint term */.  
175a0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
175b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
175c0 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   The WhereLoop o
175d0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6a  bject */.  int j
175e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
175f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
17600 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
17610 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
17620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
17630 61 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ase register */.
17640 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20    int nReg;     
17650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17660 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67  /* Number of reg
17670 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
17680 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41  te */.  char *zA
17690 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
176a0 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
176b0 79 20 73 74 72 69 6e 67 20 74 6f 20 72 65 74 75  y string to retu
176c0 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  rn */..  /* This
176d0 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20   module is only 
176e0 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79 20  called on query 
176f0 70 6c 61 6e 73 20 74 68 61 74 20 75 73 65 20 61  plans that use a
17700 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 70 4c  n index. */.  pL
17710 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
17720 4c 6f 6f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  Loop;.  assert( 
17730 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
17740 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
17750 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 6e 45  ABLE)==0 );.  nE
17760 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
17770 65 65 2e 6e 45 71 3b 0a 20 20 6e 53 6b 69 70 20  ee.nEq;.  nSkip 
17780 3d 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3b 0a  = pLoop->nSkip;.
17790 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
177a0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
177b0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
177c0 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  0 );..  /* Figur
177d0 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
177e0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
177f0 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
17800 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
17810 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50  /.  regBase = pP
17820 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
17830 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e    nReg = pLoop->
17840 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45  u.btree.nEq + nE
17850 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73  xtraReg;.  pPars
17860 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
17870 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74  ..  zAff = sqlit
17880 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73  e3DbStrDup(pPars
17890 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e  e->db, sqlite3In
178a0 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76  dexAffinityStr(v
178b0 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20  , pIdx));.  if( 
178c0 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61  !zAff ){.    pPa
178d0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
178e0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  ailed = 1;.  }..
178f0 20 20 69 66 28 20 6e 53 6b 69 70 20 29 7b 0a 20    if( nSkip ){. 
17900 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d     int iIdxCur =
17910 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
17920 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17930 65 41 64 64 4f 70 31 28 76 2c 20 28 62 52 65 76  eAddOp1(v, (bRev
17940 3f 4f 50 5f 4c 61 73 74 3a 4f 50 5f 52 65 77 69  ?OP_Last:OP_Rewi
17950 6e 64 29 2c 20 69 49 64 78 43 75 72 29 3b 0a 20  nd), iIdxCur);. 
17960 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
17970 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20  f(v, bRev==0);. 
17980 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
17990 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20  f(v, bRev!=0);. 
179a0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
179b0 76 2c 20 22 62 65 67 69 6e 20 73 6b 69 70 2d 73  v, "begin skip-s
179c0 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 49 64 78  can on %s", pIdx
179d0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 6a  ->zName));.    j
179e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
179f0 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
17a00 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  ;.    pLevel->ad
17a10 64 72 53 6b 69 70 20 3d 20 73 71 6c 69 74 65 33  drSkip = sqlite3
17a20 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
17a30 20 28 62 52 65 76 3f 4f 50 5f 53 65 65 6b 4c 54   (bRev?OP_SeekLT
17a40 3a 4f 50 5f 53 65 65 6b 47 54 29 2c 0a 20 20 20  :OP_SeekGT),.   
17a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a60 20 20 20 20 20 20 20 20 20 69 49 64 78 43 75 72           iIdxCur
17a70 2c 20 30 2c 20 72 65 67 42 61 73 65 2c 20 6e 53  , 0, regBase, nS
17a80 6b 69 70 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  kip);.    VdbeCo
17a90 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
17aa0 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  ==0);.    VdbeCo
17ab0 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
17ac0 21 3d 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  !=0);.    sqlite
17ad0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
17ae0 20 6a 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30   j);.    for(j=0
17af0 3b 20 6a 3c 6e 53 6b 69 70 3b 20 6a 2b 2b 29 7b  ; j<nSkip; j++){
17b00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17b10 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
17b20 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
17b30 6a 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  j, regBase+j);. 
17b40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
17b50 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d  x->aiColumn[j]>=
17b60 30 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  0 );.      VdbeC
17b70 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
17b80 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
17b90 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75  Col[pIdx->aiColu
17ba0 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a  mn[j]].zName));.
17bb0 20 20 20 20 7d 0a 20 20 7d 20 20 20 20 0a 0a 20      }.  }    .. 
17bc0 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
17bd0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
17be0 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  aints.  */.  ass
17bf0 65 72 74 28 20 7a 41 66 66 3d 3d 30 20 7c 7c 20  ert( zAff==0 || 
17c00 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 66 66  (int)strlen(zAff
17c10 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28  )>=nEq );.  for(
17c20 6a 3d 6e 53 6b 69 70 3b 20 6a 3c 6e 45 71 3b 20  j=nSkip; j<nEq; 
17c30 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31  j++){.    int r1
17c40 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c  ;.    pTerm = pL
17c50 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a  oop->aLTerm[j];.
17c60 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
17c70 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54  m!=0 );.    /* T
17c80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
17c90 74 63 61 73 65 20 69 73 20 74 72 75 65 20 66 6f  tcase is true fo
17ca0 72 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 72  r indices with r
17cb0 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73  edundant columns
17cc0 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43 52  . .    ** Ex: CR
17cd0 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
17ce0 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45   t1(a,b,a); SELE
17cf0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
17d00 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20  RE a=0 AND b=0; 
17d10 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  */.    testcase(
17d20 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
17d30 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d   & TERM_CODED)!=
17d40 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
17d50 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
17d60 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
17d70 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f 64   );.    r1 = cod
17d80 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
17d90 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
17da0 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65  vel, j, bRev, re
17db0 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66  gBase+j);.    if
17dc0 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20  ( r1!=regBase+j 
17dd0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65  ){.      if( nRe
17de0 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  g==1 ){.        
17df0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
17e00 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
17e10 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  gBase);.        
17e20 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20  regBase = r1;.  
17e30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17e40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17e50 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
17e60 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29  , r1, regBase+j)
17e70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17e80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
17e90 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
17ea0 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
17eb0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
17ec0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
17ed0 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66 28 20  O_IN );.    if( 
17ee0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
17ef0 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57  r & (WO_ISNULL|W
17f00 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20  O_IN))==0 ){.   
17f10 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
17f20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  = pTerm->pExpr->
17f30 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
17f40 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  ( sqlite3ExprCan
17f50 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 20 29  BeNull(pRight) )
17f60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17f70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17f80 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73  P_IsNull, regBas
17f90 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e+j, pLevel->add
17fa0 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 56  rBrk);.        V
17fb0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
17fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17fd0 28 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20  ( zAff ){.      
17fe0 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
17ff0 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
18000 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53  ght, zAff[j])==S
18010 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
18020 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66  {.          zAff
18030 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  [j] = SQLITE_AFF
18040 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
18050 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
18060 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
18070 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52  ffinityChange(pR
18080 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29  ight, zAff[j]) )
18090 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66  {.          zAff
180a0 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  [j] = SQLITE_AFF
180b0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
180c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
180d0 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41   }.  *pzAff = zA
180e0 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67  ff;.  return reg
180f0 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Base;.}..#ifndef
18100 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
18110 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  LAIN./*.** This 
18120 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 65 6c  routine is a hel
18130 70 65 72 20 66 6f 72 20 65 78 70 6c 61 69 6e 49  per for explainI
18140 6e 64 65 78 52 61 6e 67 65 28 29 20 62 65 6c 6f  ndexRange() belo
18150 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c  w.**.** pStr hol
18160 64 73 20 74 68 65 20 74 65 78 74 20 6f 66 20 61  ds the text of a
18170 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
18180 74 20 77 65 20 61 72 65 20 62 75 69 6c 64 69 6e  t we are buildin
18190 67 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a  g up one term.**
181a0 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69   at a time.  Thi
181b0 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 61  s routine adds a
181c0 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65   new term to the
181d0 20 65 6e 64 20 6f 66 20 74 68 65 20 65 78 70 72   end of the expr
181e0 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73  ession..** Terms
181f0 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20 62   are separated b
18200 79 20 41 4e 44 20 73 6f 20 61 64 64 20 74 68 65  y AND so add the
18210 20 22 41 4e 44 22 20 74 65 78 74 20 66 6f 72 20   "AND" text for 
18220 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65  second and subse
18230 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f  quent.** terms o
18240 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nly..*/.static v
18250 6f 69 64 20 65 78 70 6c 61 69 6e 41 70 70 65 6e  oid explainAppen
18260 64 54 65 72 6d 28 0a 20 20 53 74 72 41 63 63 75  dTerm(.  StrAccu
18270 6d 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20 20  m *pStr,        
18280 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74       /* The text
18290 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e   expression bein
182a0 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74  g built */.  int
182b0 20 69 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20   iTerm,         
182c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
182d0 78 20 6f 66 20 74 68 69 73 20 74 65 72 6d 2e 20  x of this term. 
182e0 20 46 69 72 73 74 20 69 73 20 7a 65 72 6f 20 2a   First is zero *
182f0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
18300 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  zColumn,        
18310 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
18320 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  olumn */.  const
18330 20 63 68 61 72 20 2a 7a 4f 70 20 20 20 20 20 20   char *zOp      
18340 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
18350 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 2a  f the operator *
18360 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54 65 72 6d  /.){.  if( iTerm
18370 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   ) sqlite3StrAcc
18380 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22  umAppend(pStr, "
18390 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 73 71   AND ", 5);.  sq
183a0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
183b0 65 6e 64 41 6c 6c 28 70 53 74 72 2c 20 7a 43 6f  endAll(pStr, zCo
183c0 6c 75 6d 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  lumn);.  sqlite3
183d0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
183e0 53 74 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20  Str, zOp, 1);.  
183f0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
18400 70 70 65 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c  ppend(pStr, "?",
18410 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72   1);.}../*.** Ar
18420 67 75 6d 65 6e 74 20 70 4c 65 76 65 6c 20 64 65  gument pLevel de
18430 73 63 72 69 62 65 73 20 61 20 73 74 72 61 74 65  scribes a strate
18440 67 79 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20  gy for scanning 
18450 74 61 62 6c 65 20 70 54 61 62 2e 20 54 68 69 73  table pTab. This
18460 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70   .** function ap
18470 70 65 6e 64 73 20 74 65 78 74 20 74 6f 20 70 53  pends text to pS
18480 74 72 20 74 68 61 74 20 64 65 73 63 72 69 62 65  tr that describe
18490 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 20  s the subset of 
184a0 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 73 63  table.** rows sc
184b0 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74 72  anned by the str
184c0 61 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f 72  ategy in the for
184d0 6d 20 6f 66 20 61 6e 20 53 51 4c 20 65 78 70 72  m of an SQL expr
184e0 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ession..**.** Fo
184f0 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
18500 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  e query:.**.**  
18510 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
18520 31 20 57 48 45 52 45 20 61 3d 31 20 41 4e 44 20  1 WHERE a=1 AND 
18530 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75  b>2;.**.** is ru
18540 6e 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61  n and there is a
18550 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62  n index on (a, b
18560 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ), then this fun
18570 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a  ction returns a.
18580 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d 69 6c 61  ** string simila
18590 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61  r to:.**.**   "a
185a0 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a 2f 0a 73  =? AND b>?".*/.s
185b0 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
185c0 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 53 74 72  inIndexRange(Str
185d0 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 57 68 65  Accum *pStr, Whe
185e0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 54  reLoop *pLoop, T
185f0 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49  able *pTab){.  I
18600 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70  ndex *pIndex = p
18610 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
18620 6e 64 65 78 3b 0a 20 20 75 31 36 20 6e 45 71 20  ndex;.  u16 nEq 
18630 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
18640 2e 6e 45 71 3b 0a 20 20 75 31 36 20 6e 53 6b 69  .nEq;.  u16 nSki
18650 70 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70  p = pLoop->nSkip
18660 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
18670 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70  Column *aCol = p
18680 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 31 36  Tab->aCol;.  i16
18690 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e   *aiColumn = pIn
186a0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 0a  dex->aiColumn;..
186b0 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20    if( nEq==0 && 
186c0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26  (pLoop->wsFlags&
186d0 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
186e0 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
186f0 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ))==0 ) return;.
18700 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
18710 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20  mAppend(pStr, " 
18720 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d  (", 2);.  for(i=
18730 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a  0; i<nEq; i++){.
18740 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 69      char *z = ai
18750 43 6f 6c 75 6d 6e 5b 69 5d 20 3c 20 30 20 3f 20  Column[i] < 0 ? 
18760 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61  "rowid" : aCol[a
18770 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d  iColumn[i]].zNam
18780 65 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 53  e;.    if( i>=nS
18790 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 65 78 70  kip ){.      exp
187a0 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 70  lainAppendTerm(p
187b0 53 74 72 2c 20 69 2c 20 7a 2c 20 22 3d 22 29 3b  Str, i, z, "=");
187c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
187d0 20 20 69 66 28 20 69 20 29 20 73 71 6c 69 74 65    if( i ) sqlite
187e0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
187f0 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20 35  pStr, " AND ", 5
18800 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18810 58 50 72 69 6e 74 66 28 70 53 74 72 2c 20 30 2c  XPrintf(pStr, 0,
18820 20 22 41 4e 59 28 25 73 29 22 2c 20 7a 29 3b 0a   "ANY(%s)", z);.
18830 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6a 20 3d      }.  }..  j =
18840 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d   i;.  if( pLoop-
18850 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 42  >wsFlags&WHERE_B
18860 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
18870 63 68 61 72 20 2a 7a 20 3d 20 61 69 43 6f 6c 75  char *z = aiColu
18880 6d 6e 5b 6a 5d 20 3c 20 30 20 3f 20 22 72 6f 77  mn[j] < 0 ? "row
18890 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c  id" : aCol[aiCol
188a0 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[j]].zName;. 
188b0 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
188c0 54 65 72 6d 28 70 53 74 72 2c 20 69 2b 2b 2c 20  Term(pStr, i++, 
188d0 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69  z, ">");.  }.  i
188e0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
188f0 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  s&WHERE_TOP_LIMI
18900 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  T ){.    char *z
18910 20 3d 20 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3c   = aiColumn[j] <
18920 20 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61   0 ? "rowid" : a
18930 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  Col[aiColumn[j]]
18940 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c  .zName;.    expl
18950 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 70 53  ainAppendTerm(pS
18960 74 72 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a  tr, i, z, "<");.
18970 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
18980 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
18990 2c 20 22 29 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  , ")", 1);.}../*
189a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
189b0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c  n is a no-op unl
189c0 65 73 73 20 63 75 72 72 65 6e 74 6c 79 20 70 72  ess currently pr
189d0 6f 63 65 73 73 69 6e 67 20 61 6e 20 45 58 50 4c  ocessing an EXPL
189e0 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a  AIN QUERY PLAN.*
189f0 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68  * command. If th
18a00 65 20 71 75 65 72 79 20 62 65 69 6e 67 20 63 6f  e query being co
18a10 6d 70 69 6c 65 64 20 69 73 20 61 6e 20 45 58 50  mpiled is an EXP
18a20 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c  LAIN QUERY PLAN,
18a30 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63   a single.** rec
18a40 6f 72 64 20 69 73 20 61 64 64 65 64 20 74 6f 20  ord is added to 
18a50 74 68 65 20 6f 75 74 70 75 74 20 74 6f 20 64 65  the output to de
18a60 73 63 72 69 62 65 20 74 68 65 20 74 61 62 6c 65  scribe the table
18a70 20 73 63 61 6e 20 73 74 72 61 74 65 67 79 20 69   scan strategy i
18a80 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f  n .** pLevel..*/
18a90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
18aa0 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50  lainOneScan(.  P
18ab0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
18ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18ad0 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
18ae0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
18af0 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  abList,         
18b00 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69       /* Table li
18b10 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65 66  st this loop ref
18b20 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72  ers to */.  Wher
18b30 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
18b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18b50 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50 5f  can to write OP_
18b60 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66  Explain opcode f
18b70 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  or */.  int iLev
18b80 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
18b90 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
18ba0 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c   for "level" col
18bb0 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f  umn of output */
18bc0 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18be0 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
18bf0 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66  "from" column of
18c00 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75 31 36   output */.  u16
18c10 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20   wctrlFlags     
18c20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18c30 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20  Flags passed to 
18c40 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
18c50 6e 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  n() */.){.#ifnde
18c60 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
18c70 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
18c80 6c 61 69 6e 3d 3d 32 20 29 0a 23 65 6e 64 69 66  lain==2 ).#endif
18c90 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20  .  {.    struct 
18ca0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
18cb0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
18cc0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
18cd0 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ];.    Vdbe *v =
18ce0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
18cf0 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67       /* VM being
18d00 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a   constructed */.
18d10 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
18d20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
18d30 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
18d40 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndle */.    int 
18d50 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  iId = pParse->iS
18d60 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c  electId;  /* Sel
18d70 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73  ect id (left-mos
18d80 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29  t output column)
18d90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65   */.    int isSe
18da0 61 72 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  arch;           
18db0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
18dc0 72 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73  r a SEARCH. Fals
18dd0 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20  e for SCAN. */. 
18de0 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c     WhereLoop *pL
18df0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
18e00 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c   /* The controll
18e10 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  ing WhereLoop ob
18e20 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75 33 32 20  ject */.    u32 
18e30 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  flags;          
18e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
18e50 67 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  gs that describe
18e60 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
18e70 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20    char *zMsg;   
18e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e90 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20 74  /* Text to add t
18ea0 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a  o EQP output */.
18eb0 20 20 20 20 53 74 72 41 63 63 75 6d 20 73 74 72      StrAccum str
18ec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18ed0 20 20 2f 2a 20 45 51 50 20 6f 75 74 70 75 74 20    /* EQP output 
18ee0 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 63 68  string */.    ch
18ef0 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 20 20 20  ar zBuf[100];   
18f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
18f10 6e 69 74 69 61 6c 20 73 70 61 63 65 20 66 6f 72  nitial space for
18f20 20 45 51 50 20 6f 75 74 70 75 74 20 73 74 72 69   EQP output stri
18f30 6e 67 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70  ng */..    pLoop
18f40 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
18f50 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 70  p;.    flags = p
18f60 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
18f70 20 20 20 69 66 28 20 28 66 6c 61 67 73 26 57 48     if( (flags&WH
18f80 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c  ERE_MULTI_OR) ||
18f90 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
18fa0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
18fb0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  ) ) return;..   
18fc0 20 69 73 53 65 61 72 63 68 20 3d 20 28 66 6c 61   isSearch = (fla
18fd0 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49  gs&(WHERE_BTM_LI
18fe0 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  MIT|WHERE_TOP_LI
18ff0 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20  MIT))!=0.       
19000 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 26       || ((flags&
19010 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
19020 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70  LE)==0 && (pLoop
19030 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29  ->u.btree.nEq>0)
19040 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ).            ||
19050 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48   (wctrlFlags&(WH
19060 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c  ERE_ORDERBY_MIN|
19070 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
19080 58 29 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  X));..    sqlite
19090 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 73  3StrAccumInit(&s
190a0 74 72 2c 20 7a 42 75 66 2c 20 73 69 7a 65 6f 66  tr, zBuf, sizeof
190b0 28 7a 42 75 66 29 2c 20 53 51 4c 49 54 45 5f 4d  (zBuf), SQLITE_M
190c0 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 20 20  AX_LENGTH);.    
190d0 73 74 72 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  str.db = db;.   
190e0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
190f0 41 70 70 65 6e 64 41 6c 6c 28 26 73 74 72 2c 20  AppendAll(&str, 
19100 69 73 53 65 61 72 63 68 20 3f 20 22 53 45 41 52  isSearch ? "SEAR
19110 43 48 22 20 3a 20 22 53 43 41 4e 22 29 3b 0a 20  CH" : "SCAN");. 
19120 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
19130 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
19140 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 73  qlite3XPrintf(&s
19150 74 72 2c 20 30 2c 20 22 20 53 55 42 51 55 45 52  tr, 0, " SUBQUER
19160 59 20 25 64 22 2c 20 70 49 74 65 6d 2d 3e 69 53  Y %d", pItem->iS
19170 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d 65  electId);.    }e
19180 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
19190 65 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20  e3XPrintf(&str, 
191a0 30 2c 20 22 20 54 41 42 4c 45 20 25 73 22 2c 20  0, " TABLE %s", 
191b0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
191c0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49     }..    if( pI
191d0 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
191e0 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
191f0 6e 74 66 28 26 73 74 72 2c 20 30 2c 20 22 20 41  ntf(&str, 0, " A
19200 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41  S %s", pItem->zA
19210 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lias);.    }.   
19220 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 57   if( (flags & (W
19230 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56  HERE_IPK|WHERE_V
19240 49 52 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30  IRTUALTABLE))==0
19250 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
19260 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 30 3b 0a  char *zFmt = 0;.
19270 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
19280 78 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  x;..      assert
19290 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  ( pLoop->u.btree
192a0 2e 70 49 6e 64 65 78 21 3d 30 20 29 3b 0a 20 20  .pIndex!=0 );.  
192b0 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70      pIdx = pLoop
192c0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
192d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
192e0 21 28 66 6c 61 67 73 26 57 48 45 52 45 5f 41 55  !(flags&WHERE_AU
192f0 54 4f 5f 49 4e 44 45 58 29 20 7c 7c 20 28 66 6c  TO_INDEX) || (fl
19300 61 67 73 26 57 48 45 52 45 5f 49 44 58 5f 4f 4e  ags&WHERE_IDX_ON
19310 4c 59 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  LY) );.      if(
19320 20 21 48 61 73 52 6f 77 69 64 28 70 49 74 65 6d   !HasRowid(pItem
19330 2d 3e 70 54 61 62 29 20 26 26 20 49 73 50 72 69  ->pTab) && IsPri
19340 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64  maryKeyIndex(pId
19350 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  x) ){.        if
19360 28 20 69 73 53 65 61 72 63 68 20 29 7b 0a 20 20  ( isSearch ){.  
19370 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 22          zFmt = "
19380 50 52 49 4d 41 52 59 20 4b 45 59 22 3b 0a 20 20  PRIMARY KEY";.  
19390 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
193a0 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
193b0 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
193c0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74   ){.        zFmt
193d0 20 3d 20 22 41 55 54 4f 4d 41 54 49 43 20 43 4f   = "AUTOMATIC CO
193e0 56 45 52 49 4e 47 20 49 4e 44 45 58 22 3b 0a 20  VERING INDEX";. 
193f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
19400 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
19410 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  _ONLY ){.       
19420 20 7a 46 6d 74 20 3d 20 22 43 4f 56 45 52 49 4e   zFmt = "COVERIN
19430 47 20 49 4e 44 45 58 20 25 73 22 3b 0a 20 20 20  G INDEX %s";.   
19440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19450 20 20 7a 46 6d 74 20 3d 20 22 49 4e 44 45 58 20    zFmt = "INDEX 
19460 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  %s";.      }.   
19470 20 20 20 69 66 28 20 7a 46 6d 74 20 29 7b 0a 20     if( zFmt ){. 
19480 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
19490 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 73 74  rAccumAppend(&st
194a0 72 2c 20 22 20 55 53 49 4e 47 20 22 2c 20 37 29  r, " USING ", 7)
194b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
194c0 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20 30  3XPrintf(&str, 0
194d0 2c 20 7a 46 6d 74 2c 20 70 49 64 78 2d 3e 7a 4e  , zFmt, pIdx->zN
194e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 65 78  ame);.        ex
194f0 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28  plainIndexRange(
19500 26 73 74 72 2c 20 70 4c 6f 6f 70 2c 20 70 49 74  &str, pLoop, pIt
19510 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20  em->pTab);.     
19520 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
19530 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
19540 49 50 4b 29 21 3d 30 20 26 26 20 28 66 6c 61 67  IPK)!=0 && (flag
19550 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52  s & WHERE_CONSTR
19560 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  AINT)!=0 ){.    
19570 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
19580 61 6e 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20  ange;.      if( 
19590 66 6c 61 67 73 26 28 57 48 45 52 45 5f 43 4f 4c  flags&(WHERE_COL
195a0 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c  UMN_EQ|WHERE_COL
195b0 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20  UMN_IN) ){.     
195c0 20 20 20 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f     zRange = "(ro
195d0 77 69 64 3d 3f 29 22 3b 0a 20 20 20 20 20 20 7d  wid=?)";.      }
195e0 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 26  else if( (flags&
195f0 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54  WHERE_BOTH_LIMIT
19600 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49  )==WHERE_BOTH_LI
19610 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  MIT ){.        z
19620 52 61 6e 67 65 20 3d 20 22 28 72 6f 77 69 64 3e  Range = "(rowid>
19630 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 3b  ? AND rowid<?)";
19640 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
19650 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d   flags&WHERE_BTM
19660 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
19670 20 20 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f 77    zRange = "(row
19680 69 64 3e 3f 29 22 3b 0a 20 20 20 20 20 20 7d 65  id>?)";.      }e
19690 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
196a0 65 72 74 28 20 66 6c 61 67 73 26 57 48 45 52 45  ert( flags&WHERE
196b0 5f 54 4f 50 5f 4c 49 4d 49 54 29 3b 0a 20 20 20  _TOP_LIMIT);.   
196c0 20 20 20 20 20 7a 52 61 6e 67 65 20 3d 20 22 28       zRange = "(
196d0 72 6f 77 69 64 3c 3f 29 22 3b 0a 20 20 20 20 20  rowid<?)";.     
196e0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
196f0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c  StrAccumAppendAl
19700 6c 28 26 73 74 72 2c 20 22 20 55 53 49 4e 47 20  l(&str, " USING 
19710 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
19720 4b 45 59 20 22 29 3b 0a 20 20 20 20 20 20 73 71  KEY ");.      sq
19730 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
19740 65 6e 64 41 6c 6c 28 26 73 74 72 2c 20 7a 52 61  endAll(&str, zRa
19750 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  nge);.    }.#ifn
19760 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19770 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
19780 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73   else if( (flags
19790 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
197a0 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
197b0 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
197c0 66 28 26 73 74 72 2c 20 30 2c 20 22 20 56 49 52  f(&str, 0, " VIR
197d0 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58  TUAL TABLE INDEX
197e0 20 25 64 3a 25 73 22 2c 0a 20 20 20 20 20 20 20   %d:%s",.       
197f0 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
19800 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c  ->u.vtab.idxNum,
19810 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
19820 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65  dxStr);.    }.#e
19830 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
19840 54 45 5f 45 58 50 4c 41 49 4e 5f 45 53 54 49 4d  TE_EXPLAIN_ESTIM
19850 41 54 45 44 5f 52 4f 57 53 0a 20 20 20 20 69 66  ATED_ROWS.    if
19860 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 3d 31  ( pLoop->nOut>=1
19870 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
19880 65 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20  e3XPrintf(&str, 
19890 30 2c 20 22 20 28 7e 25 6c 6c 75 20 72 6f 77 73  0, " (~%llu rows
198a0 29 22 2c 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  )", sqlite3LogEs
198b0 74 54 6f 49 6e 74 28 70 4c 6f 6f 70 2d 3e 6e 4f  tToInt(pLoop->nO
198c0 75 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ut));.    }else{
198d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
198e0 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 73 74  rAccumAppend(&st
198f0 72 2c 20 22 20 28 7e 31 20 72 6f 77 29 22 2c 20  r, " (~1 row)", 
19900 39 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  9);.    }.#endif
19910 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
19920 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
19930 68 28 26 73 74 72 29 3b 0a 20 20 20 20 73 71 6c  h(&str);.    sql
19940 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
19950 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49  , OP_Explain, iI
19960 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d  d, iLevel, iFrom
19970 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
19980 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
19990 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
199a0 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78  nOneScan(u,v,w,x
199b0 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
199c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
199d0 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47  AIN */.../*.** G
199e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
199f0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
19a00 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70  e iLevel-th loop
19a10 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
19a20 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  ause.** implemen
19a30 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  tation described
19a40 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73   by pWInfo..*/.s
19a50 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
19a60 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a  deOneLoopStart(.
19a70 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
19a80 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65  nfo,   /* Comple
19a90 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
19aa0 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63  bout the WHERE c
19ab0 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
19ac0 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
19ad0 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f  /* Which level o
19ae0 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68  f pWInfo->a[] sh
19af0 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f  ould be coded */
19b00 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
19b10 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68  ady     /* Which
19b20 20 74 61 62 6c 65 73 20 61 72 65 20 63 75 72 72   tables are curr
19b30 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20  ently available 
19b40 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b  */.){.  int j, k
19b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
19b60 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
19b70 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
19b80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
19b90 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
19ba0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
19bb0 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20  t addrNxt;      
19bc0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
19bd0 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ump to continue 
19be0 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
19bf0 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   case */.  int o
19c00 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20  mitTable;       
19c10 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73  /* True if we us
19c20 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79  e the index only
19c30 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20   */.  int bRev; 
19c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
19c50 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ue if we need to
19c60 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   scan in reverse
19c70 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72   order */.  Wher
19c80 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
19c90 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65   /* The where le
19ca0 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20  vel to be coded 
19cb0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
19cc0 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65  pLoop;    /* The
19cd0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
19ce0 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
19cf0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
19d00 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d  pWC;    /* Decom
19d10 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
19d20 65 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c 61  entire WHERE cla
19d30 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  use */.  WhereTe
19d40 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
19d50 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48           /* A WH
19d60 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
19d70 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
19d80 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
19d90 72 73 65 3b 20 2f 2a 20 50 61 72 73 69 6e 67 20  rse; /* Parsing 
19da0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
19db0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19dd0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
19de0 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ion */.  Vdbe *v
19df0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
19e00 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
19e10 70 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e  prepared stmt un
19e20 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
19e30 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
19e40 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
19e50 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63  Item;  /* FROM c
19e60 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
19e70 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
19e80 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20  addrBrk;        
19e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
19ea0 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
19eb0 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  k out of the loo
19ec0 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
19ed0 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ont;            
19ee0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
19ef0 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
19f00 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20  with next cycle 
19f10 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52  */.  int iRowidR
19f20 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  eg = 0;        /
19f30 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65  * Rowid is store
19f40 64 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  d in this regist
19f50 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20  er, if not zero 
19f60 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73  */.  int iReleas
19f70 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f  eReg = 0;      /
19f80 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20  * Temp register 
19f90 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20 72  to free before r
19fa0 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 23 69 66 20  eturning */.#if 
19fb0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
19fc0 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64  EBUG) && defined
19fd0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c  (SQLITE_ENABLE_L
19fe0 4f 4f 50 43 4f 55 4e 54 45 52 53 29 0a 20 20 69  OOPCOUNTERS).  i
19ff0 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d  nt addrExplain =
1a000 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1a010 65 6e 74 41 64 64 72 28 76 29 2d 31 3b 0a 20 20  entAddr(v)-1;.  
1a020 69 6e 74 20 61 64 64 72 54 65 73 74 3b 20 20 20  int addrTest;   
1a030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1a040 72 65 73 73 20 6f 66 20 6e 6f 6e 2d 69 6e 64 65  ress of non-inde
1a050 78 65 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  xed WHERE clause
1a060 20 74 65 73 74 20 2a 2f 0a 23 65 6e 64 69 66 0a   test */.#endif.
1a070 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f  .  pWC = &pWInfo
1a080 2d 3e 73 57 43 3b 0a 20 20 64 62 20 3d 20 70 50  ->sWC;.  db = pP
1a090 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4c 65 76  arse->db;.  pLev
1a0a0 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
1a0b0 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70  iLevel];.  pLoop
1a0c0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
1a0d0 70 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  p;.  pTabItem = 
1a0e0 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
1a0f0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
1a100 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54  om];.  iCur = pT
1a110 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
1a120 0a 20 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65  .  pLevel->notRe
1a130 61 64 79 20 3d 20 6e 6f 74 52 65 61 64 79 20 26  ady = notReady &
1a140 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66   ~getMask(&pWInf
1a150 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75  o->sMaskSet, iCu
1a160 72 29 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 57  r);.  bRev = (pW
1a170 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69  Info->revMask>>i
1a180 4c 65 76 65 6c 29 26 31 3b 0a 20 20 6f 6d 69 74  Level)&1;.  omit
1a190 54 61 62 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e  Table = (pLoop->
1a1a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1a1b0 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20  IDX_ONLY)!=0 .  
1a1c0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
1a1d0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
1a1e0 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41  & WHERE_FORCE_TA
1a1f0 42 4c 45 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4d  BLE)==0;.  VdbeM
1a200 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
1a210 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d 6c 6f   "Begin WHERE-lo
1a220 6f 70 25 64 3a 20 25 73 22 2c 69 4c 65 76 65 6c  op%d: %s",iLevel
1a230 2c 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d  ,pTabItem->pTab-
1a240 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20  >zName));..  /* 
1a250 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f  Create labels fo
1a260 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e  r the "break" an
1a270 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73  d "continue" ins
1a280 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66  tructions.  ** f
1a290 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  or the current l
1a2a0 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64  oop.  Jump to ad
1a2b0 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f  drBrk to break o
1a2c0 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20  ut of a loop..  
1a2d0 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20  ** Jump to cont 
1a2e0 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c  to go immediatel
1a2f0 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74  y to the next it
1a300 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  eration of the. 
1a310 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20   ** loop..  **. 
1a320 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69   ** When there i
1a330 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  s an IN operator
1a340 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61  , we also have a
1a350 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c   "addrNxt" label
1a360 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73   that.  ** means
1a370 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
1a380 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61  h the next IN va
1a390 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e  lue combination.
1a3a0 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72    When.  ** ther
1a3b0 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72  e are no IN oper
1a3c0 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e  ators in the con
1a3d0 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61  straints, the "a
1a3e0 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20  ddrNxt" label.  
1a3f0 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ** is the same a
1a400 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a  s "addrBrk"..  *
1a410 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c  /.  addrBrk = pL
1a420 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20  evel->addrBrk = 
1a430 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20  pLevel->addrNxt 
1a440 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1a450 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64  eLabel(v);.  add
1a460 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  rCont = pLevel->
1a470 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74  addrCont = sqlit
1a480 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1a490 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  v);..  /* If thi
1a4a0 73 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  s is the right t
1a4b0 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f  able of a LEFT O
1a4c0 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63  UTER JOIN, alloc
1a4d0 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69  ate and.  ** ini
1a4e0 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79  tialize a memory
1a4f0 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72   cell that recor
1a500 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ds if this table
1a510 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a   matches any.  *
1a520 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66  * row of the lef
1a530 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
1a540 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  oin..  */.  if( 
1a550 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20  pLevel->iFrom>0 
1a560 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e  && (pTabItem[0].
1a570 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
1a580 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c  FT)!=0 ){.    pL
1a590 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
1a5a0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1a5b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a5c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1a5d0 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c  teger, 0, pLevel
1a5e0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
1a5f0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1a600 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49  , "init LEFT JOI
1a610 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22  N no-match flag"
1a620 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  ));.  }..  /* Sp
1a630 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
1a640 46 52 4f 4d 20 63 6c 61 75 73 65 20 73 75 62 71  FROM clause subq
1a650 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64  uery implemented
1a660 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   as a co-routine
1a670 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 49 74   */.  if( pTabIt
1a680 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
1a690 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59   ){.    int regY
1a6a0 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d  ield = pTabItem-
1a6b0 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
1a6c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a6d0 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
1a6e0 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
1a6f0 20 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64   0, pTabItem->ad
1a700 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
1a710 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71  pLevel->p2 =  sq
1a720 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a730 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a740 59 69 65 6c 64 2c 20 61 64 64 72 42 72 6b 29 3b  Yield, addrBrk);
1a750 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1a760 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
1a770 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20  mment((v, "next 
1a780 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22 2c 20  row of \"%s\"", 
1a790 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
1a7a0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 70 4c 65  zName));.    pLe
1a7b0 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74  vel->op = OP_Got
1a7c0 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  o;.  }else..#ifn
1a7d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a7e0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
1a7f0 66 28 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  f(  (pLoop->wsFl
1a800 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
1a810 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
1a820 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
1a830 54 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76  The table is a v
1a840 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55  irtual-table.  U
1a850 73 65 20 74 68 65 20 56 46 69 6c 74 65 72 20 61  se the VFilter a
1a860 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20  nd VNext.    ** 
1a870 20 20 20 20 20 20 20 20 20 74 6f 20 61 63 63 65           to acce
1a880 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20  ss the data..   
1a890 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67   */.    int iReg
1a8a0 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20  ;   /* P3 Value 
1a8b0 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a  for OP_VFilter *
1a8c0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 6f  /.    int addrNo
1a8d0 74 46 6f 75 6e 64 3b 0a 20 20 20 20 69 6e 74 20  tFound;.    int 
1a8e0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 4c  nConstraint = pL
1a8f0 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 0a 0a 20 20  oop->nLTerm;..  
1a900 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1a910 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1a920 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
1a930 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
1a940 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  Parse, nConstrai
1a950 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 4e  nt+2);.    addrN
1a960 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c  otFound = pLevel
1a970 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20 20 20 66  ->addrBrk;.    f
1a980 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74  or(j=0; j<nConst
1a990 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  raint; j++){.   
1a9a0 20 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 3d     int iTarget =
1a9b0 20 69 52 65 67 2b 6a 2b 32 3b 0a 20 20 20 20 20   iReg+j+2;.     
1a9c0 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
1a9d0 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20  aLTerm[j];.     
1a9e0 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
1a9f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1aa00 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
1aa10 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a  ator & WO_IN ){.
1aa20 20 20 20 20 20 20 20 20 63 6f 64 65 45 71 75 61          codeEqua
1aa30 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
1aa40 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20   pTerm, pLevel, 
1aa50 6a 2c 20 62 52 65 76 2c 20 69 54 61 72 67 65 74  j, bRev, iTarget
1aa60 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 4e  );.        addrN
1aa70 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c  otFound = pLevel
1aa80 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 20  ->addrNxt;.     
1aa90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1aaa0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1aab0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
1aac0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54  Expr->pRight, iT
1aad0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
1aae0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1aaf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ab00 50 5f 49 6e 74 65 67 65 72 2c 20 70 4c 6f 6f 70  P_Integer, pLoop
1ab10 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c  ->u.vtab.idxNum,
1ab20 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69   iReg);.    sqli
1ab30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ab40 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 43 6f   OP_Integer, nCo
1ab50 6e 73 74 72 61 69 6e 74 2c 20 69 52 65 67 2b 31  nstraint, iReg+1
1ab60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1ab70 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
1ab80 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64  Filter, iCur, ad
1ab90 64 72 4e 6f 74 46 6f 75 6e 64 2c 20 69 52 65 67  drNotFound, iReg
1aba0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1abb0 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75          pLoop->u
1abc0 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 0a 20 20  .vtab.idxStr,.  
1abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abe0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61      pLoop->u.vta
1abf0 62 2e 6e 65 65 64 46 72 65 65 20 3f 20 50 34 5f  b.needFree ? P4_
1ac00 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41  MPRINTF : P4_STA
1ac10 54 49 43 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  TIC);.    VdbeCo
1ac20 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 70  verage(v);.    p
1ac30 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  Loop->u.vtab.nee
1ac40 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 66  dFree = 0;.    f
1ac50 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74  or(j=0; j<nConst
1ac60 72 61 69 6e 74 20 26 26 20 6a 3c 31 36 3b 20 6a  raint && j<16; j
1ac70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
1ac80 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  pLoop->u.vtab.om
1ac90 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20 29 7b 0a  itMask>>j)&1 ){.
1aca0 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
1acb0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4c 6f 6f  erm(pLevel, pLoo
1acc0 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29 3b 0a 20  p->aLTerm[j]);. 
1acd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1ace0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1acf0 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76  _VNext;.    pLev
1ad00 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
1ad10 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
1ad20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1ad30 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
1ad40 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1ad50 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  pRange(pParse, i
1ad60 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  Reg, nConstraint
1ad70 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +2);.    sqlite3
1ad80 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1ad90 72 73 65 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  rse);.  }else.#e
1ada0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1adb0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1adc0 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4c 6f 6f   */..  if( (pLoo
1add0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1ade0 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 26 26  RE_IPK)!=0.   &&
1adf0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1ae00 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
1ae10 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  _IN|WHERE_COLUMN
1ae20 5f 45 51 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20  _EQ))!=0.  ){.  
1ae30 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65    /* Case 2:  We
1ae40 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65   can directly re
1ae50 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65  ference a single
1ae60 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20   row using an.  
1ae70 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71    **          eq
1ae80 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
1ae90 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
1aea0 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20  WID field.  Or. 
1aeb0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77     **          w
1aec0 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74  e reference mult
1aed0 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20  iple rows using 
1aee0 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e  a "rowid IN (...
1aef0 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  )".    **       
1af00 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20     construct..  
1af10 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1af20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1af30 6e 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54  nEq==1 );.    pT
1af40 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
1af50 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65  erm[0];.    asse
1af60 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
1af70 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
1af80 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  m->pExpr!=0 );. 
1af90 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
1afa0 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74  able==0 );.    t
1afb0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1afc0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1afd0 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 69 52  IRTUAL );.    iR
1afe0 65 6c 65 61 73 65 52 65 67 20 3d 20 2b 2b 70 50  eleaseReg = ++pP
1aff0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1b000 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65  iRowidReg = code
1b010 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
1b020 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
1b030 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20 69 52 65  el, 0, bRev, iRe
1b040 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 69  leaseReg);.    i
1b050 66 28 20 69 52 6f 77 69 64 52 65 67 21 3d 69 52  f( iRowidReg!=iR
1b060 65 6c 65 61 73 65 52 65 67 20 29 20 73 71 6c 69  eleaseReg ) sqli
1b070 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1b080 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61  g(pParse, iRelea
1b090 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72  seReg);.    addr
1b0a0 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Nxt = pLevel->ad
1b0b0 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  drNxt;.    sqlit
1b0c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b0d0 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52  OP_MustBeInt, iR
1b0e0 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74  owidReg, addrNxt
1b0f0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1b100 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1b110 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1b120 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c  NotExists, iCur,
1b130 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64   addrNxt, iRowid
1b140 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Reg);.    VdbeCo
1b150 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1b160 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
1b170 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
1b180 61 72 73 65 2c 20 69 52 6f 77 69 64 52 65 67 2c  arse, iRowidReg,
1b190 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
1b1a0 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
1b1b0 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
1b1c0 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1b1d0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1b1e0 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65   "pk"));.    pLe
1b1f0 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
1b200 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  p;.  }else if( (
1b210 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1b220 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20   WHERE_IPK)!=0. 
1b230 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f          && (pLoo
1b240 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1b250 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29  RE_COLUMN_RANGE)
1b260 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
1b270 43 61 73 65 20 33 3a 20 20 57 65 20 68 61 76 65  Case 3:  We have
1b280 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63   an inequality c
1b290 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
1b2a0 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
1b2b0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
1b2c0 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f  t testOp = OP_No
1b2d0 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  op;.    int star
1b2e0 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e  t;.    int memEn
1b2f0 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20  dValue = 0;.    
1b300 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72  WhereTerm *pStar
1b310 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61  t, *pEnd;..    a
1b320 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
1b330 3d 3d 30 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30  ==0 );.    j = 0
1b340 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70  ;.    pStart = p
1b350 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  End = 0;.    if(
1b360 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1b370 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
1b380 54 20 29 20 70 53 74 61 72 74 20 3d 20 70 4c 6f  T ) pStart = pLo
1b390 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
1b3a0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1b3b0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1b3c0 54 4f 50 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64  TOP_LIMIT ) pEnd
1b3d0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1b3e0 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72  [j++];.    asser
1b3f0 74 28 20 70 53 74 61 72 74 21 3d 30 20 7c 7c 20  t( pStart!=0 || 
1b400 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 69  pEnd!=0 );.    i
1b410 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
1b420 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b   pTerm = pStart;
1b430 0a 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20  .      pStart = 
1b440 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64  pEnd;.      pEnd
1b450 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   = pTerm;.    }.
1b460 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
1b470 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
1b480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b490 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
1b4a0 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
1b4b0 20 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a   start bound */.
1b4c0 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54        int r1, rT
1b4d0 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  emp;        /* R
1b4e0 65 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c  egisters for hol
1b4f0 64 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 62  ding the start b
1b500 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20  oundary */..    
1b510 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1b520 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73  ng constant maps
1b530 20 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74   TK_xx codes int
1b540 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  o corresponding 
1b550 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f  .      ** seek o
1b560 70 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65  pcodes.  It depe
1b570 6e 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75  nds on a particu
1b580 6c 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20  lar ordering of 
1b590 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20  TK_xx.      */. 
1b5a0 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d       const u8 aM
1b5b0 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  oveOp[] = {.    
1b5c0 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20         /* TK_GT 
1b5d0 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 54 2c 0a 20  */  OP_SeekGT,. 
1b5e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
1b5f0 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 45  LE */  OP_SeekLE
1b600 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
1b610 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_LT */  OP_See
1b620 6b 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  kLT,.           
1b630 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f  /* TK_GE */  OP_
1b640 53 65 65 6b 47 45 0a 20 20 20 20 20 20 7d 3b 0a  SeekGE.      };.
1b650 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1b660 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20  _LE==TK_GT+1 ); 
1b670 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
1b680 65 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e  e the ordering..
1b690 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1b6a0 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32  ( TK_LT==TK_GT+2
1b6b0 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e   );      /*  ...
1b6c0 20 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61   of the TK_xx va
1b6d0 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20  lues... */.     
1b6e0 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
1b6f0 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20  TK_GT+3 );      
1b700 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65  /*  ... is corre
1b710 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 61  cct. */..      a
1b720 73 73 65 72 74 28 20 28 70 53 74 61 72 74 2d 3e  ssert( (pStart->
1b730 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1b740 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NULL)==0 );.    
1b750 20 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61    testcase( pSta
1b760 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
1b770 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1b780 20 20 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d      pX = pStart-
1b790 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
1b7a0 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
1b7b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1b7c0 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f  Start->leftCurso
1b7d0 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 74 72  r!=iCur ); /* tr
1b7e0 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61  ansitive constra
1b7f0 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 72 31  ints */.      r1
1b800 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1b810 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1b820 58 2d 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d  X->pRight, &rTem
1b830 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
1b840 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61  3VdbeAddOp3(v, a
1b850 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b  MoveOp[pX->op-TK
1b860 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72  _GT], iCur, addr
1b870 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Brk, r1);.      
1b880 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1b890 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 56 64  "pk"));.      Vd
1b8a0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1b8b0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a  pX->op==TK_GT);.
1b8c0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b8d0 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d  geIf(v, pX->op==
1b8e0 54 4b 5f 4c 45 29 3b 0a 20 20 20 20 20 20 56 64  TK_LE);.      Vd
1b8f0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1b900 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a  pX->op==TK_LT);.
1b910 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b920 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d  geIf(v, pX->op==
1b930 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 73 71  TK_GE);.      sq
1b940 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
1b950 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
1b960 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  rse, r1, 1);.   
1b970 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1b980 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1b990 20 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64   rTemp);.      d
1b9a0 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1b9b0 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20  l, pStart);.    
1b9c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1b9d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b9e0 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
1b9f0 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43   : OP_Rewind, iC
1ba00 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  ur, addrBrk);.  
1ba10 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1ba20 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a  If(v, bRev==0);.
1ba30 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1ba40 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29  geIf(v, bRev!=0)
1ba50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ba60 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78  pEnd ){.      Ex
1ba70 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58  pr *pX;.      pX
1ba80 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a   = pEnd->pExpr;.
1ba90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
1baa0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1bab0 65 72 74 28 20 28 70 45 6e 64 2d 3e 77 74 46 6c  ert( (pEnd->wtFl
1bac0 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
1bad0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  )==0 );.      te
1bae0 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 6c 65  stcase( pEnd->le
1baf0 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29  ftCursor!=iCur )
1bb00 3b 20 2f 2a 20 54 72 61 6e 73 69 74 69 76 65 20  ; /* Transitive 
1bb10 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
1bb20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1bb30 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1bb40 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
1bb50 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65       memEndValue
1bb60 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1bb70 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1bb80 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1bb90 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d   pX->pRight, mem
1bba0 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  EndValue);.     
1bbb0 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
1bbc0 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LT || pX->op==TK
1bbd0 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74  _GT ){.        t
1bbe0 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
1bbf0 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20  P_Le : OP_Ge;.  
1bc00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bc10 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
1bc20 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74   ? OP_Lt : OP_Gt
1bc30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bc40 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1bc50 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d  el, pEnd);.    }
1bc60 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c  .    start = sql
1bc70 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1bc80 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76  ddr(v);.    pLev
1bc90 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20  el->op = bRev ? 
1bca0 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
1bcb0 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  t;.    pLevel->p
1bcc0 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
1bcd0 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
1bce0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
1bcf0 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
1bd00 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
1bd10 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
1bd20 69 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b 70 50  iRowidReg = ++pP
1bd30 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1bd40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bd50 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
1bd60 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67   iCur, iRowidReg
1bd70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1bd80 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
1bd90 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
1bda0 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1bdb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bdc0 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20  dOp3(v, testOp, 
1bdd0 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64  memEndValue, add
1bde0 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29  rBrk, iRowidReg)
1bdf0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1be00 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70  rageIf(v, testOp
1be10 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
1be20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1be30 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 74 29  , testOp==OP_Lt)
1be40 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1be50 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70  rageIf(v, testOp
1be60 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
1be70 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1be80 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 74 29  , testOp==OP_Gt)
1be90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1bea0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
1beb0 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
1bec0 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  C | SQLITE_JUMPI
1bed0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  FNULL);.    }.  
1bee0 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d  }else if( pLoop-
1bef0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1bf00 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
1bf10 2f 2a 20 43 61 73 65 20 34 3a 20 41 20 73 63 61  /* Case 4: A sca
1bf20 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  n using an index
1bf30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1bf40 20 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52          The WHER
1bf50 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e  E clause may con
1bf60 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  tain zero or mor
1bf70 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20  e equality .    
1bf80 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73  **         terms
1bf90 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f   ("==" or "IN" o
1bfa0 70 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72  perators) that r
1bfb0 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20  efer to the N.  
1bfc0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66    **         lef
1bfd0 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f  t-most columns o
1bfe0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20  f the index. It 
1bff0 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
1c000 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1c010 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1c020 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d  raints (>, <, >=
1c030 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69   or <=) on the i
1c040 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20  ndexed.    **   
1c050 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61        column tha
1c060 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  t immediately fo
1c070 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61  llows the N equa
1c080 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20  lities. Only .  
1c090 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
1c0a0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
1c0b0 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
1c0c0 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
1c0d0 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20  st must.    **  
1c0e0 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22         use the "
1c0f0 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65  ==" and "IN" ope
1c100 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d  rators. For exam
1c110 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20  ple, if the .   
1c120 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65   **         inde
1c130 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c  x is on (x,y,z),
1c140 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   then the follow
1c150 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20  ing clauses are 
1c160 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  all .    **     
1c170 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20      optimized:. 
1c180 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1c190 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20          x=5.    
1c1a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
1c1b0 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a  5 AND y=10.    *
1c1c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1c1d0 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
1c1e0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1c1f0 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30  AND y>5 AND y<10
1c200 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1c210 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41     x=5 AND y=5 A
1c220 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a  ND z<=10.    **.
1c230 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
1c240 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20  he z<10 term of 
1c250 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  the following ca
1c260 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e  nnot be used, on
1c270 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ly.    **       
1c280 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a    the x=5 term:.
1c290 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1c2a0 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
1c2b0 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20   z<10.    **.   
1c2c0 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61   **         N ma
1c2d0 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65  y be zero if the
1c2e0 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74  re are inequalit
1c2f0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20  y constraints.. 
1c300 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66     **         If
1c310 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e   there are no in
1c320 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1c330 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20  ints, then N is 
1c340 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  at.    **       
1c350 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20    least one..   
1c360 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1c370 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20     This case is 
1c380 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74  also used when t
1c390 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52  here are no WHER
1c3a0 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  E clause.    ** 
1c3b0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69          constrai
1c3c0 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78  nts but an index
1c3d0 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79   is selected any
1c3e0 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20  way, in order.  
1c3f0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20    **         to 
1c400 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74  force the output
1c410 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72   order to confor
1c420 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59  m to an ORDER BY
1c430 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73  ..    */  .    s
1c440 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
1c450 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20  StartOp[] = {.  
1c460 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a      0,.      0,.
1c470 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c        OP_Rewind,
1c480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a             /* 2:
1c490 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61   (!start_constra
1c4a0 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20  ints && startEq 
1c4b0 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20  &&  !bRev) */.  
1c4c0 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20      OP_Last,    
1c4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28           /* 3: (
1c4e0 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  !start_constrain
1c4f0 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26  ts && startEq &&
1c500 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20     bRev) */.    
1c510 20 20 4f 50 5f 53 65 65 6b 47 54 2c 20 20 20 20    OP_SeekGT,    
1c520 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74         /* 4: (st
1c530 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1c540 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20   && !startEq && 
1c550 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1c560 4f 50 5f 53 65 65 6b 4c 54 2c 20 20 20 20 20 20  OP_SeekLT,      
1c570 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72       /* 5: (star
1c580 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1c590 26 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62  & !startEq &&  b
1c5a0 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1c5b0 5f 53 65 65 6b 47 45 2c 20 20 20 20 20 20 20 20  _SeekGE,        
1c5c0 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f     /* 6: (start_
1c5d0 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
1c5e0 20 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65   startEq && !bRe
1c5f0 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
1c600 65 65 6b 4c 45 20 20 20 20 20 20 20 20 20 20 20  eekLE           
1c610 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f   /* 7: (start_co
1c620 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73  nstraints  &&  s
1c630 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29  tartEq &&  bRev)
1c640 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73   */.    };.    s
1c650 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
1c660 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  EndOp[] = {.    
1c670 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20    OP_IdxGE,     
1c680 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 65 6e         /* 0: (en
1c690 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
1c6a0 20 21 62 52 65 76 20 26 26 20 21 65 6e 64 45 71   !bRev && !endEq
1c6b0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
1c6c0 78 47 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  xGT,            
1c6d0 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 1: (end_const
1c6e0 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 20  raints && !bRev 
1c6f0 26 26 20 20 65 6e 64 45 71 29 20 2a 2f 0a 20 20  &&  endEq) */.  
1c700 20 20 20 20 4f 50 5f 49 64 78 4c 45 2c 20 20 20      OP_IdxLE,   
1c710 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28           /* 2: (
1c720 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
1c730 26 26 20 20 62 52 65 76 20 26 26 20 21 65 6e 64  &&  bRev && !end
1c740 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  Eq) */.      OP_
1c750 49 64 78 4c 54 2c 20 20 20 20 20 20 20 20 20 20  IdxLT,          
1c760 20 20 2f 2a 20 33 3a 20 28 65 6e 64 5f 63 6f 6e    /* 3: (end_con
1c770 73 74 72 61 69 6e 74 73 20 26 26 20 20 62 52 65  straints &&  bRe
1c780 76 20 26 26 20 20 65 6e 64 45 71 29 20 2a 2f 0a  v &&  endEq) */.
1c790 20 20 20 20 7d 3b 0a 20 20 20 20 75 31 36 20 6e      };.    u16 n
1c7a0 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
1c7b0 72 65 65 2e 6e 45 71 3b 20 20 20 20 20 2f 2a 20  ree.nEq;     /* 
1c7c0 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  Number of == or 
1c7d0 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  IN terms */.    
1c7e0 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c800 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f  Base register ho
1c810 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74  lding constraint
1c820 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 57   values */.    W
1c830 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
1c840 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49  Start = 0;  /* I
1c850 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1c860 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74  aint at range st
1c870 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  art */.    Where
1c880 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20  Term *pRangeEnd 
1c890 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75  = 0;    /* Inequ
1c8a0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1c8b0 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f   at range end */
1c8c0 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 45 71  .    int startEq
1c8d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c8e0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
1c8f0 67 65 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d  ge start uses ==
1c900 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20  , >= or <= */.  
1c910 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20    int endEq;    
1c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c930 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20  * True if range 
1c940 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20  end uses ==, >= 
1c950 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74  or <= */.    int
1c960 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
1c970 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61  ts;       /* Sta
1c980 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63  rt of range is c
1c990 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20  onstrained */.  
1c9a0 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
1c9b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
1c9c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73  * Number of cons
1c9d0 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a  traint terms */.
1c9e0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca00 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65   /* The index we
1ca10 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a   will be using *
1ca20 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  /.    int iIdxCu
1ca30 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
1ca40 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
1ca50 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e  ursor for the in
1ca60 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  dex */.    int n
1ca70 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20  ExtraReg = 0;   
1ca80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ca90 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
1caa0 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20  ters needed */. 
1cab0 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20     int op;      
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cad0 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f  /* Instruction o
1cae0 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61  pcode */.    cha
1caf0 72 20 2a 7a 53 74 61 72 74 41 66 66 3b 20 20 20  r *zStartAff;   
1cb00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
1cb10 69 6e 69 74 79 20 66 6f 72 20 73 74 61 72 74 20  inity for start 
1cb20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  of range constra
1cb30 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  int */.    char 
1cb40 63 45 6e 64 41 66 66 20 3d 20 30 3b 20 20 20 20  cEndAff = 0;    
1cb50 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
1cb60 69 74 79 20 66 6f 72 20 65 6e 64 20 6f 66 20 72  ity for end of r
1cb70 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
1cb80 2a 2f 0a 20 20 20 20 75 38 20 62 53 65 65 6b 50  */.    u8 bSeekP
1cb90 61 73 74 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20  astNull = 0;    
1cba0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
1cbb0 65 65 6b 20 70 61 73 74 20 69 6e 69 74 69 61 6c  eek past initial
1cbc0 20 6e 75 6c 6c 73 20 2a 2f 0a 20 20 20 20 75 38   nulls */.    u8
1cbd0 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20 3d 20 30   bStopAtNull = 0
1cbe0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
1cbf0 64 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 74  d condition to t
1cc00 65 72 6d 69 6e 61 74 65 20 61 74 20 4e 55 4c 4c  erminate at NULL
1cc10 73 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d  s */..    pIdx =
1cc20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1cc30 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 49 64 78  pIndex;.    iIdx
1cc40 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
1cc50 64 78 43 75 72 3b 0a 20 20 20 20 61 73 73 65 72  dxCur;.    asser
1cc60 74 28 20 6e 45 71 3e 3d 70 4c 6f 6f 70 2d 3e 6e  t( nEq>=pLoop->n
1cc70 53 6b 69 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Skip );..    /* 
1cc80 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74  If this loop sat
1cc90 69 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72  isfies a sort or
1cca0 64 65 72 20 28 70 4f 72 64 65 72 42 79 29 20 72  der (pOrderBy) r
1ccb0 65 71 75 65 73 74 20 74 68 61 74 20 0a 20 20 20  equest that .   
1ccc0 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20 74   ** was passed t
1ccd0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
1cce0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22  to implement a "
1ccf0 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e  SELECT min(x) ..
1cd00 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79  ." .    ** query
1cd10 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
1cd20 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f  r will only allo
1cd30 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75  w the loop to ru
1cd40 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73  n for.    ** a s
1cd50 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e  ingle iteration.
1cd60 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
1cd70 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72   the first row r
1cd80 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73  eturned.    ** s
1cd90 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61  hould not have a
1cda0 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72   NULL value stor
1cdb0 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f  ed in 'x'. If co
1cdc0 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20  lumn 'x' is.    
1cdd0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65  ** the first one
1cde0 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65   after the nEq e
1cdf0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1ce00 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
1ce10 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65  ,.    ** this re
1ce20 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63  quires some spec
1ce30 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20  ial handling..  
1ce40 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1ce50 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
1ce60 79 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  y==0.         ||
1ce70 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
1ce80 79 2d 3e 6e 45 78 70 72 3d 3d 31 0a 20 20 20 20  y->nExpr==1.    
1ce90 20 20 20 20 20 7c 7c 20 28 70 57 49 6e 66 6f 2d       || (pWInfo-
1cea0 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  >wctrlFlags&WHER
1ceb0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3d 3d  E_ORDERBY_MIN)==
1cec0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 57  0 );.    if( (pW
1ced0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
1cee0 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  &WHERE_ORDERBY_M
1cef0 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20 70  IN)!=0.     && p
1cf00 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 0a  WInfo->nOBSat>0.
1cf10 20 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e       && (pIdx->n
1cf20 4b 65 79 43 6f 6c 3e 6e 45 71 29 0a 20 20 20 20  KeyCol>nEq).    
1cf30 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1cf40 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3d 3d 30   pLoop->nSkip==0
1cf50 20 29 3b 0a 20 20 20 20 20 20 62 53 65 65 6b 50   );.      bSeekP
1cf60 61 73 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20  astNull = 1;.   
1cf70 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
1cf80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1cf90 46 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c  Find any inequal
1cfa0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  ity constraint t
1cfb0 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61  erms for the sta
1cfc0 72 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20  rt and end .    
1cfd0 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  ** of the range.
1cfe0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6a 20 3d   .    */.    j =
1cff0 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 4c   nEq;.    if( pL
1d000 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1d010 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
1d020 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53 74  {.      pRangeSt
1d030 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  art = pLoop->aLT
1d040 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20  erm[j++];.      
1d050 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
1d060 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
1d070 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1d080 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b  ERE_TOP_LIMIT ){
1d090 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64  .      pRangeEnd
1d0a0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1d0b0 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78  [j++];.      nEx
1d0c0 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
1d0d0 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72    if( pRangeStar
1d0e0 74 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  t==0.       && (
1d0f0 6a 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  j = pIdx->aiColu
1d100 6d 6e 5b 6e 45 71 5d 29 3e 3d 30 20 0a 20 20 20  mn[nEq])>=0 .   
1d110 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70 54 61      && pIdx->pTa
1d120 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74  ble->aCol[j].not
1d130 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 29 7b  Null==0.      ){
1d140 0a 20 20 20 20 20 20 20 20 62 53 65 65 6b 50 61  .        bSeekPa
1d150 73 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20  stNull = 1;.    
1d160 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1d170 73 65 72 74 28 20 70 52 61 6e 67 65 45 6e 64 3d  sert( pRangeEnd=
1d180 3d 30 20 7c 7c 20 28 70 52 61 6e 67 65 45 6e 64  =0 || (pRangeEnd
1d190 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1d1a0 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 0a 20  _VNULL)==0 );.. 
1d1b0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
1d1c0 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
1d1d0 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  all constraint t
1d1e0 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72  erms using == or
1d1f0 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73   IN.    ** and s
1d200 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73 20  tore the values 
1d210 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69  of those terms i
1d220 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
1d230 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
1d240 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 42 61  tarting at regBa
1d250 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  se..    */.    r
1d260 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c  egBase = codeAll
1d270 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50  EqualityTerms(pP
1d280 61 72 73 65 2c 70 4c 65 76 65 6c 2c 62 52 65 76  arse,pLevel,bRev
1d290 2c 6e 45 78 74 72 61 52 65 67 2c 26 7a 53 74 61  ,nExtraReg,&zSta
1d2a0 72 74 41 66 66 29 3b 0a 20 20 20 20 61 73 73 65  rtAff);.    asse
1d2b0 72 74 28 20 7a 53 74 61 72 74 41 66 66 3d 3d 30  rt( zStartAff==0
1d2c0 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 6c 65   || sqlite3Strle
1d2d0 6e 33 30 28 7a 53 74 61 72 74 41 66 66 29 3e 3d  n30(zStartAff)>=
1d2e0 6e 45 71 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  nEq );.    if( z
1d2f0 53 74 61 72 74 41 66 66 20 29 20 63 45 6e 64 41  StartAff ) cEndA
1d300 66 66 20 3d 20 7a 53 74 61 72 74 41 66 66 5b 6e  ff = zStartAff[n
1d310 45 71 5d 3b 0a 20 20 20 20 61 64 64 72 4e 78 74  Eq];.    addrNxt
1d320 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
1d330 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  xt;..    /* If w
1d340 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65  e are doing a re
1d350 76 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e  verse order scan
1d360 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67   on an ascending
1d370 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a   index, or.    *
1d380 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65  * a forward orde
1d390 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63  r scan on a desc
1d3a0 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e  ending index, in
1d3b0 74 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20  terchange the . 
1d3c0 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20     ** start and 
1d3d0 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67  end terms (pRang
1d3e0 65 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67  eStart and pRang
1d3f0 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  eEnd)..    */.  
1d400 20 20 69 66 28 20 28 6e 45 71 3c 70 49 64 78 2d    if( (nEq<pIdx-
1d410 3e 6e 4b 65 79 43 6f 6c 20 26 26 20 62 52 65 76  >nKeyCol && bRev
1d420 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  ==(pIdx->aSortOr
1d430 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45  der[nEq]==SQLITE
1d440 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20 20 20 7c  _SO_ASC)).     |
1d450 7c 20 28 62 52 65 76 20 26 26 20 70 49 64 78 2d  | (bRev && pIdx-
1d460 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 45 71 29 0a 20  >nKeyCol==nEq). 
1d470 20 20 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50     ){.      SWAP
1d480 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52  (WhereTerm *, pR
1d490 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53  angeEnd, pRangeS
1d4a0 74 61 72 74 29 3b 0a 20 20 20 20 20 20 53 57 41  tart);.      SWA
1d4b0 50 28 75 38 2c 20 62 53 65 65 6b 50 61 73 74 4e  P(u8, bSeekPastN
1d4c0 75 6c 6c 2c 20 62 53 74 6f 70 41 74 4e 75 6c 6c  ull, bStopAtNull
1d4d0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65  );.    }..    te
1d4e0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
1d4f0 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74  art && (pRangeSt
1d500 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
1d510 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20   WO_LE)!=0 );.  
1d520 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1d530 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e  geStart && (pRan
1d540 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
1d550 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29  or & WO_GE)!=0 )
1d560 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d570 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52  pRangeEnd && (pR
1d580 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
1d590 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29  or & WO_LE)!=0 )
1d5a0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d5b0 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52  pRangeEnd && (pR
1d5c0 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
1d5d0 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29  or & WO_GE)!=0 )
1d5e0 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d 20  ;.    startEq = 
1d5f0 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20  !pRangeStart || 
1d600 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
1d610 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
1d620 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45  WO_GE);.    endE
1d630 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64  q =   !pRangeEnd
1d640 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   || pRangeEnd->e
1d650 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
1d660 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74  E|WO_GE);.    st
1d670 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1d680 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c  = pRangeStart ||
1d690 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20   nEq>0;..    /* 
1d6a0 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63  Seek the index c
1d6b0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61  ursor to the sta
1d6c0 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  rt of the range.
1d6d0 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61   */.    nConstra
1d6e0 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69  int = nEq;.    i
1d6f0 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 29  f( pRangeStart )
1d700 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
1d710 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61  ight = pRangeSta
1d720 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rt->pExpr->pRigh
1d730 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
1d740 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1d750 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
1d760 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28  +nEq);.      if(
1d770 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77   (pRangeStart->w
1d780 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
1d790 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  ULL)==0.       &
1d7a0 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  & sqlite3ExprCan
1d7b0 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 0a 20  BeNull(pRight). 
1d7c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1d7d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d7e0 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
1d7f0 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64  regBase+nEq, add
1d800 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 20 20 56  rNxt);.        V
1d810 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1d820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1d830 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20  ( zStartAff ){. 
1d840 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1d850 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
1d860 79 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74  y(pRight, zStart
1d870 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54  Aff[nEq])==SQLIT
1d880 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20  E_AFF_NONE){.   
1d890 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20         /* Since 
1d8a0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
1d8b0 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65  s to be performe
1d8c0 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72  d with no conver
1d8d0 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20  sions.          
1d8e0 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68  ** applied to th
1d8f0 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20  e operands, set 
1d900 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
1d910 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20  apply to pRight 
1d920 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  to .          **
1d930 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1d940 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
1d950 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d  zStartAff[nEq] =
1d960 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1d970 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d980 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1d990 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
1d9a0 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
1d9b0 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29   zStartAff[nEq])
1d9c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53   ){.          zS
1d9d0 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53  tartAff[nEq] = S
1d9e0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
1d9f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1da00 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  }  .      nConst
1da10 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74  raint++;.      t
1da20 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
1da30 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
1da40 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
1da50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 53      }else if( bS
1da60 65 65 6b 50 61 73 74 4e 75 6c 6c 20 29 7b 0a 20  eekPastNull ){. 
1da70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1da80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1da90 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45  l, 0, regBase+nE
1daa0 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  q);.      nConst
1dab0 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  raint++;.      s
1dac0 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20  tartEq = 0;.    
1dad0 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69    start_constrai
1dae0 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nts = 1;.    }. 
1daf0 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
1db00 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
1db10 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
1db20 74 20 2d 20 62 53 65 65 6b 50 61 73 74 4e 75 6c  t - bSeekPastNul
1db30 6c 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  l, zStartAff);. 
1db40 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70     op = aStartOp
1db50 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  [(start_constrai
1db60 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74  nts<<2) + (start
1db70 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a  Eq<<1) + bRev];.
1db80 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d      assert( op!=
1db90 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
1dba0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
1dbb0 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64   op, iIdxCur, ad
1dbc0 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20  drNxt, regBase, 
1dbd0 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
1dbe0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1dbf0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1dc00 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
1dc10 52 65 77 69 6e 64 29 3b 20 20 74 65 73 74 63 61  Rewind);  testca
1dc20 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e  se( op==OP_Rewin
1dc30 64 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  d );.    VdbeCov
1dc40 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
1dc50 50 5f 4c 61 73 74 29 3b 20 20 20 20 74 65 73 74  P_Last);    test
1dc60 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73  case( op==OP_Las
1dc70 74 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  t );.    VdbeCov
1dc80 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
1dc90 50 5f 53 65 65 6b 47 54 29 3b 20 20 74 65 73 74  P_SeekGT);  test
1dca0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
1dcb0 6b 47 54 20 29 3b 0a 20 20 20 20 56 64 62 65 43  kGT );.    VdbeC
1dcc0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1dcd0 3d 4f 50 5f 53 65 65 6b 47 45 29 3b 20 20 74 65  =OP_SeekGE);  te
1dce0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
1dcf0 65 65 6b 47 45 20 29 3b 0a 20 20 20 20 56 64 62  eekGE );.    Vdb
1dd00 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1dd10 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 29 3b 20 20  p==OP_SeekLE);  
1dd20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1dd30 5f 53 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 56  _SeekLE );.    V
1dd40 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1dd50 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29 3b   op==OP_SeekLT);
1dd60 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1dd70 4f 50 5f 53 65 65 6b 4c 54 20 29 3b 0a 0a 20 20  OP_SeekLT );..  
1dd80 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61    /* Load the va
1dd90 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71  lue for the ineq
1dda0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1ddb0 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  t at the end of 
1ddc0 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65  the.    ** range
1ddd0 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a   (if any)..    *
1dde0 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e  /.    nConstrain
1ddf0 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28  t = nEq;.    if(
1de00 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20   pRangeEnd ){.  
1de10 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
1de20 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45   = pRangeEnd->pE
1de30 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
1de40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1de50 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
1de60 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31  , regBase+nEq, 1
1de70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1de80 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1de90 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
1dea0 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28  +nEq);.      if(
1deb0 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46   (pRangeEnd->wtF
1dec0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
1ded0 4c 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  L)==0.       && 
1dee0 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
1def0 4e 75 6c 6c 28 70 52 69 67 68 74 29 0a 20 20 20  Null(pRight).   
1df00 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
1df10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1df20 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
1df30 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
1df40 78 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  xt);.        Vdb
1df50 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1df60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1df70 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1df80 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 63  finity(pRight, c
1df90 45 6e 64 41 66 66 29 21 3d 53 51 4c 49 54 45 5f  EndAff)!=SQLITE_
1dfa0 41 46 46 5f 4e 4f 4e 45 0a 20 20 20 20 20 20 20  AFF_NONE.       
1dfb0 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 4e  && !sqlite3ExprN
1dfc0 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
1dfd0 61 6e 67 65 28 70 52 69 67 68 74 2c 20 63 45 6e  ange(pRight, cEn
1dfe0 64 41 66 66 29 0a 20 20 20 20 20 20 29 7b 0a 20  dAff).      ){. 
1dff0 20 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79         codeApply
1e000 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
1e010 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 2c   regBase+nEq, 1,
1e020 20 26 63 45 6e 64 41 66 66 29 3b 0a 20 20 20 20   &cEndAff);.    
1e030 20 20 7d 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74    }.      nConst
1e040 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74  raint++;.      t
1e050 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
1e060 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
1e070 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1e080 20 20 7d 65 6c 73 65 20 69 66 28 20 62 53 74 6f    }else if( bSto
1e090 70 41 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  pAtNull ){.     
1e0a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e0b0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1e0c0 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
1e0d0 20 20 20 20 20 20 65 6e 64 45 71 20 3d 20 30 3b        endEq = 0;
1e0e0 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
1e0f0 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
1e100 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1e110 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 0a 20  , zStartAff);.. 
1e120 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
1e130 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20   loop body */.  
1e140 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
1e150 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1e160 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f  tAddr(v);..    /
1e170 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69  * Check if the i
1e180 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73 20 70  ndex cursor is p
1e190 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
1e1a0 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20  he range. */.   
1e1b0 20 69 66 28 20 6e 43 6f 6e 73 74 72 61 69 6e 74   if( nConstraint
1e1c0 20 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20 61   ){.      op = a
1e1d0 45 6e 64 4f 70 5b 62 52 65 76 2a 32 20 2b 20 65  EndOp[bRev*2 + e
1e1e0 6e 64 45 71 5d 3b 0a 20 20 20 20 20 20 73 71 6c  ndEq];.      sql
1e1f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1e200 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  t(v, op, iIdxCur
1e210 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61  , addrNxt, regBa
1e220 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  se, nConstraint)
1e230 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e240 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 54 20 29  ( op==OP_IdxGT )
1e250 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ;  VdbeCoverageI
1e260 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 47  f(v, op==OP_IdxG
1e270 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
1e280 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47  ase( op==OP_IdxG
1e290 45 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  E );  VdbeCovera
1e2a0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49  geIf(v, op==OP_I
1e2b0 64 78 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65  dxGE );.      te
1e2c0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49  stcase( op==OP_I
1e2d0 64 78 4c 54 20 29 3b 20 20 56 64 62 65 43 6f 76  dxLT );  VdbeCov
1e2e0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
1e2f0 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 20  P_IdxLT );.     
1e300 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1e310 50 5f 49 64 78 4c 45 20 29 3b 20 20 56 64 62 65  P_IdxLE );  Vdbe
1e320 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1e330 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b 0a 20 20  ==OP_IdxLE );.  
1e340 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b    }..    /* Seek
1e350 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   the table curso
1e360 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  r, if required *
1e370 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72  /.    disableTer
1e380 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
1e390 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61  Start);.    disa
1e3a0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1e3b0 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20  pRangeEnd);.    
1e3c0 69 66 28 20 6f 6d 69 74 54 61 62 6c 65 20 29 7b  if( omitTable ){
1e3d0 0a 20 20 20 20 20 20 2f 2a 20 70 49 64 78 20 69  .      /* pIdx i
1e3e0 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
1e3f0 65 78 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  ex.  No need to 
1e400 61 63 63 65 73 73 20 74 68 65 20 6d 61 69 6e 20  access the main 
1e410 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 7d 65  table. */.    }e
1e420 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77 69 64  lse if( HasRowid
1e430 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 20 29  (pIdx->pTable) )
1e440 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
1e450 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
1e460 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
1e470 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e480 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
1e490 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Cur, iRowidReg);
1e4a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1e4b0 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
1e4c0 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69  rse, iCur, -1, i
1e4d0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1e4e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e4f0 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69  p2(v, OP_Seek, i
1e500 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Cur, iRowidReg);
1e510 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65    /* Deferred se
1e520 65 6b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20  ek */.    }else 
1e530 69 66 28 20 69 43 75 72 21 3d 69 49 64 78 43 75  if( iCur!=iIdxCu
1e540 72 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  r ){.      Index
1e550 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50   *pPk = sqlite3P
1e560 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
1e570 49 64 78 2d 3e 70 54 61 62 6c 65 29 3b 0a 20 20  Idx->pTable);.  
1e580 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
1e590 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
1e5a0 6e 67 65 28 70 50 61 72 73 65 2c 20 70 50 6b 2d  nge(pParse, pPk-
1e5b0 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20  >nKeyCol);.     
1e5c0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d   for(j=0; j<pPk-
1e5d0 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
1e5e0 20 20 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69          k = sqli
1e5f0 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
1e600 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61 69 43 6f  (pIdx, pPk->aiCo
1e610 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  lumn[j]);.      
1e620 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e630 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
1e640 2c 20 69 49 64 78 43 75 72 2c 20 6b 2c 20 69 52  , iIdxCur, k, iR
1e650 6f 77 69 64 52 65 67 2b 6a 29 3b 0a 20 20 20 20  owidReg+j);.    
1e660 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1e670 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1e680 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69  , OP_NotFound, i
1e690 43 75 72 2c 20 61 64 64 72 43 6f 6e 74 2c 0a 20  Cur, addrCont,. 
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6b0 20 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64            iRowid
1e6c0 52 65 67 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Reg, pPk->nKeyCo
1e6d0 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
1e6e0 28 76 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (v);.    }..    
1e6f0 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e  /* Record the in
1e700 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74  struction used t
1e710 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
1e720 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20  loop. Disable . 
1e730 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75     ** WHERE clau
1e740 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65  se terms made re
1e750 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69  dundant by the i
1e760 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e  ndex range scan.
1e770 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e780 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1e790 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b   WHERE_ONEROW ){
1e7a0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
1e7b0 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
1e7c0 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20   }else if( bRev 
1e7d0 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
1e7e0 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20  >op = OP_Prev;. 
1e7f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e800 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1e810 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
1e820 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64  pLevel->p1 = iId
1e830 78 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  xCur;.    pLevel
1e840 2d 3e 70 33 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77  ->p3 = (pLoop->w
1e850 73 46 6c 61 67 73 26 57 48 45 52 45 5f 55 4e 51  sFlags&WHERE_UNQ
1e860 5f 57 41 4e 54 45 44 29 21 3d 30 20 3f 20 31 3a  _WANTED)!=0 ? 1:
1e870 30 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  0;.    if( (pLoo
1e880 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1e890 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d  RE_CONSTRAINT)==
1e8a0 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
1e8b0 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
1e8c0 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
1e8d0 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c  AN_STEP;.    }el
1e8e0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1e8f0 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
1e900 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
1e910 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1e920 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
1e930 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f  ATION.  if( pLoo
1e940 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1e950 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
1e960 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54     /* Case 5:  T
1e970 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
1e980 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65  ately indexed te
1e990 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
1e9a0 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   OR.    **.    *
1e9b0 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
1e9c0 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
1e9d0 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
1e9e0 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  ,d);.    **   CR
1e9f0 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
1ea00 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(a);.    **  
1ea10 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
1ea20 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a   ON t1(b);.    *
1ea30 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
1ea40 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20   i3 ON t1(c);.  
1ea50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
1ea60 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1ea70 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20  HERE a=5 OR b=7 
1ea80 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31  OR (c=11 AND d=1
1ea90 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  3).    **.    **
1eaa0 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c   In the example,
1eab0 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
1eac0 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
1ead0 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a  onnected by OR..
1eae0 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f      ** The top o
1eaf0 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73  f the loop looks
1eb00 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
1eb10 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1eb20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1eb40 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
1eb50 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
1eb60 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f  .    ** Then, fo
1eb70 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74  r each indexed t
1eb80 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  erm, the followi
1eb90 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  ng. The argument
1eba0 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53  s to.    ** RowS
1ebb0 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20  etTest are such 
1ebc0 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f  that the rowid o
1ebd0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
1ebe0 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20  w is inserted.  
1ebf0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f    ** into the Ro
1ec00 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61  wSet. If it is a
1ec10 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20  lready present, 
1ec20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68  control skips th
1ec30 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f  e.    ** Gosub o
1ec40 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20  pcode and jumps 
1ec50 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20  straight to the 
1ec60 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
1ec70 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20  y WhereEnd()..  
1ec80 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1ec90 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
1eca0 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20  egin(<term>).   
1ecb0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77   **          Row
1ecc0 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20  SetTest         
1ecd0 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72           # Inser
1ece0 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77  t rowid into row
1ecf0 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  set.    **      
1ed00 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32      Gosub      2
1ed10 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   A.    **       
1ed20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1ed30 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ().    **.    **
1ed40 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61   Following the a
1ed50 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65  bove, code to te
1ed60 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
1ed70 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74  . Label A, the t
1ed80 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20  arget.    ** of 
1ed90 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c  the Gosub above,
1eda0 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e   jumps to the in
1edb0 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20  struction right 
1edc0 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a  after the Goto..
1edd0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1ede0 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
1edf0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
1ee00 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
1ee10 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
1ee20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
1ee30 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20  to       B      
1ee40 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20            # The 
1ee50 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64  loop is finished
1ee60 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1ee70 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62        A: <loop b
1ee80 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20  ody>            
1ee90 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61       # Return da
1eea0 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20  ta, whatever..  
1eeb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1eec0 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20       Return     
1eed0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
1eee0 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20   # Jump back to 
1eef0 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a  the Gosub.    **
1ef00 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a  .    **       B:
1ef10 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70   <after the loop
1ef20 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  >.    **.    ** 
1ef30 41 64 64 65 64 20 32 30 31 34 2d 30 35 2d 32 36  Added 2014-05-26
1ef40 3a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69  : If the table i
1ef50 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  s a WITHOUT ROWI
1ef60 44 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 20 20  D table, then.  
1ef70 20 20 2a 2a 20 75 73 65 20 61 6e 20 65 70 68 65    ** use an ephe
1ef80 6d 65 72 61 6c 20 69 6e 64 65 78 20 69 6e 73 74  meral index inst
1ef90 65 61 64 20 6f 66 20 61 20 52 6f 77 53 65 74 20  ead of a RowSet 
1efa0 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 70 72  to record the pr
1efb0 69 6d 61 72 79 0a 20 20 20 20 2a 2a 20 6b 65 79  imary.    ** key
1efc0 73 20 6f 66 20 74 68 65 20 72 6f 77 73 20 77 65  s of the rows we
1efd0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65   have already se
1efe0 65 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  en..    **.    *
1eff0 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73  /.    WhereClaus
1f000 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20  e *pOrWc;    /* 
1f010 54 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72  The OR-clause br
1f020 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75  oken out into su
1f030 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72  bterms */.    Sr
1f040 63 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20  cList *pOrTab;  
1f050 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65       /* Shortene
1f060 64 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20  d table list or 
1f070 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61  OR-clause genera
1f080 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65  tion */.    Inde
1f090 78 20 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20  x *pCov = 0;    
1f0a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65           /* Pote
1f0b0 6e 74 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69  ntial covering i
1f0c0 6e 64 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  ndex (or NULL) *
1f0d0 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75  /.    int iCovCu
1f0e0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
1f0f0 2b 2b 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75  ++;  /* Cursor u
1f100 73 65 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63  sed for index sc
1f110 61 6e 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ans (if any) */.
1f120 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 74 75  .    int regRetu
1f130 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
1f140 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Mem;           /
1f150 2a 20 52 65 67 69 73 74 65 72 20 75 73 65 64 20  * Register used 
1f160 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f  with OP_Gosub */
1f170 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73  .    int regRows
1f180 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f1a0 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 52  * Register for R
1f1b0 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  owSet object */.
1f1c0 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
1f1d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f1f0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
1f200 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69  g rowid */.    i
1f210 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73  nt iLoopBody = s
1f220 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1f230 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72  bel(v);  /* Star
1f240 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a  t of loop body *
1f250 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e  /.    int iRetIn
1f260 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
1f270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f280 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 65  /* Address of re
1f290 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a  gReturn init */.
1f2a0 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64      int untested
1f2b0 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20  Terms = 0;      
1f2c0 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74         /* Some t
1f2d0 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  erms not complet
1f2e0 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ely tested */.  
1f2f0 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
1f300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f310 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1f320 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20  nter */.    u16 
1f330 77 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20  wctrlFlags;     
1f340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f350 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 75 62 2d  * Flags for sub-
1f360 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1f370 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45 78      Expr *pAndEx
1f380 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pr = 0;         
1f390 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e         /* An "..
1f3a0 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70 72   AND (...)" expr
1f3b0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61  ession */.    Ta
1f3c0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
1f3d0 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 0a  Item->pTab;.   .
1f3e0 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
1f3f0 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20  p->aLTerm[0];.  
1f400 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
1f410 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1f420 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
1f430 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20  or & WO_OR );.  
1f440 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
1f450 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1f460 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20  _ORINFO)!=0 );. 
1f470 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72     pOrWc = &pTer
1f480 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
1f490 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1f4a0 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20   = OP_Return;.  
1f4b0 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72    pLevel->p1 = r
1f4c0 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f  egReturn;..    /
1f4d0 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20 53  * Set up a new S
1f4e0 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61 62  rcList in pOrTab
1f4f0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1f500 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e  table being scan
1f510 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ned.    ** by th
1f520 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61  is loop in the a
1f530 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c  [0] slot and all
1f540 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73   notReady tables
1f550 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73   in a[1..] slots
1f560 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65  ..    ** This be
1f570 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73  comes the SrcLis
1f580 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  t in the recursi
1f590 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ve call to sqlit
1f5a0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a  e3WhereBegin()..
1f5b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1f5c0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20  WInfo->nLevel>1 
1f5d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f  ){.      int nNo
1f5e0 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
1f5f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1f600 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64  umber of notRead
1f610 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  y tables */.    
1f620 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1f630 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20  _item *origSrc; 
1f640 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
1f650 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  list of tables *
1f660 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64  /.      nNotRead
1f670 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  y = pWInfo->nLev
1f680 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b  el - iLevel - 1;
1f690 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20  .      pOrTab = 
1f6a0 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f  sqlite3StackAllo
1f6b0 63 52 61 77 28 64 62 2c 0a 20 20 20 20 20 20 20  cRaw(db,.       
1f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6d0 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72       sizeof(*pOr
1f6e0 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a  Tab)+ nNotReady*
1f6f0 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61  sizeof(pOrTab->a
1f700 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  [0]));.      if(
1f710 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65 74   pOrTab==0 ) ret
1f720 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20  urn notReady;.  
1f730 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c      pOrTab->nAll
1f740 6f 63 20 3d 20 28 75 38 29 28 6e 4e 6f 74 52 65  oc = (u8)(nNotRe
1f750 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20 20  ady + 1);.      
1f760 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70  pOrTab->nSrc = p
1f770 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20  OrTab->nAlloc;. 
1f780 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72 54       memcpy(pOrT
1f790 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c  ab->a, pTabItem,
1f7a0 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74 65   sizeof(*pTabIte
1f7b0 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67 53  m));.      origS
1f7c0 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  rc = pWInfo->pTa
1f7d0 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  bList->a;.      
1f7e0 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74  for(k=1; k<=nNot
1f7f0 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20  Ready; k++){.   
1f800 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f 72       memcpy(&pOr
1f810 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67  Tab->a[k], &orig
1f820 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46  Src[pLevel[k].iF
1f830 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72  rom], sizeof(pOr
1f840 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20  Tab->a[k]));.   
1f850 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1f860 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 70        pOrTab = p
1f870 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
1f880 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1f890 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 6f  nitialize the ro
1f8a0 77 73 65 74 20 72 65 67 69 73 74 65 72 20 74 6f  wset register to
1f8b0 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41   contain NULL. A
1f8c0 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20  n SQL NULL is . 
1f8d0 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74     ** equivalent
1f8e0 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f 77   to an empty row
1f8f0 73 65 74 2e 20 20 4f 72 2c 20 63 72 65 61 74 65  set.  Or, create
1f900 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
1f910 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 70 61 62  dex.    ** capab
1f920 6c 65 20 6f 66 20 68 6f 6c 64 69 6e 67 20 70 72  le of holding pr
1f930 69 6d 61 72 79 20 6b 65 79 73 20 69 6e 20 74 68  imary keys in th
1f940 65 20 63 61 73 65 20 6f 66 20 61 20 57 49 54 48  e case of a WITH
1f950 4f 55 54 20 52 4f 57 49 44 2e 0a 20 20 20 20 2a  OUT ROWID..    *
1f960 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e  *.    ** Also in
1f970 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75  itialize regRetu
1f980 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  rn to contain th
1f990 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
1f9a0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20   instruction .  
1f9b0 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
1f9c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f   following the O
1f9d0 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65 20  P_Return at the 
1f9e0 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
1f9f0 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  op. This.    ** 
1fa00 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 61  is required in a
1fa10 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46   few obscure LEF
1fa20 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65  T JOIN cases whe
1fa30 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  re control jumps
1fa40 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65  .    ** over the
1fa50 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   top of the loop
1fa60 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
1fa70 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61  f it. In this ca
1fa80 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  se the .    ** c
1fa90 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20  orrect response 
1faa0 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c  for the end-of-l
1fab0 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50  oop code (the OP
1fac0 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a  _Return) is to .
1fad0 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f      ** fall thro
1fae0 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
1faf0 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73  instruction, jus
1fb00 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20  t as an OP_Next 
1fb10 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63  does if.    ** c
1fb20 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e  alled on an unin
1fb30 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72  itialized cursor
1fb40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1fb50 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
1fb60 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50  lags & WHERE_DUP
1fb70 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29  LICATES_OK)==0 )
1fb80 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52  {.      if( HasR
1fb90 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
1fba0 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20        regRowset 
1fbb0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1fbc0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1fbd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1fbe0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f  P_Null, 0, regRo
1fbf0 77 73 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  wset);.      }el
1fc00 73 65 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65  se{.        Inde
1fc10 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33  x *pPk = sqlite3
1fc20 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
1fc30 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 72  pTab);.        r
1fc40 65 67 52 6f 77 73 65 74 20 3d 20 70 50 61 72 73  egRowset = pPars
1fc50 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
1fc60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1fc70 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
1fc80 70 68 65 6d 65 72 61 6c 2c 20 72 65 67 52 6f 77  phemeral, regRow
1fc90 73 65 74 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  set, pPk->nKeyCo
1fca0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
1fcb0 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
1fcc0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 50 6b 29  nfo(pParse, pPk)
1fcd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fce0 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  regRowid = ++pPa
1fcf0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d  rse->nMem;.    }
1fd00 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d 20  .    iRetInit = 
1fd10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fd20 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1fd30 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a   0, regReturn);.
1fd40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
1fd50 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c  riginal WHERE cl
1fd60 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74 68 65  ause is z of the
1fd70 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20 78   form:  (x1 OR x
1fd80 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79 0a  2 OR ...) AND y.
1fd90 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72 20      ** Then for 
1fda0 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c 20 65  every term xN, e
1fdb0 76 61 6c 75 61 74 65 20 61 73 20 74 68 65 20 73  valuate as the s
1fdc0 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20 78 4e  ubexpression: xN
1fdd0 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54 68   AND z.    ** Th
1fde0 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20 69 6e  at way, terms in
1fdf0 20 79 20 74 68 61 74 20 61 72 65 20 66 61 63 74   y that are fact
1fe00 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64 69  ored into the di
1fe10 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 20  sjunction will. 
1fe20 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65 64 20     ** be picked 
1fe30 75 70 20 62 79 20 74 68 65 20 72 65 63 75 72 73  up by the recurs
1fe40 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ive calls to sql
1fe50 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
1fe60 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20   below..    **. 
1fe70 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20     ** Actually, 
1fe80 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69  each subexpressi
1fe90 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20  on is converted 
1fea0 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20 77 68  to "xN AND w" wh
1feb0 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a 2a 20  ere w is.    ** 
1fec0 74 68 65 20 22 69 6e 74 65 72 65 73 74 69 6e 67  the "interesting
1fed0 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20 74  " terms of z - t
1fee0 65 72 6d 73 20 74 68 61 74 20 64 69 64 20 6e 6f  erms that did no
1fef0 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  t originate in t
1ff00 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72 20  he.    ** ON or 
1ff10 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
1ff20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64  a LEFT JOIN, and
1ff30 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20   terms that are 
1ff40 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20 20 2a  usable as .    *
1ff50 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  * indices..    *
1ff60 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 6f 70  *.    ** This op
1ff70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73 6f 20  timization also 
1ff80 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 69 66 20  only applies if 
1ff90 74 68 65 20 28 78 31 20 4f 52 20 78 32 20 4f 52  the (x1 OR x2 OR
1ffa0 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20 20 2a   ...) term.    *
1ffb0 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  * is not contain
1ffc0 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61  ed in the ON cla
1ffd0 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
1ffe0 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74  IN..    ** See t
1fff0 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77 77 77  icket http://www
20000 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f  .sqlite.org/src/
20010 69 6e 66 6f 2f 66 32 33 36 39 33 30 34 65 34 0a  info/f2369304e4.
20020 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
20030 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20  WC->nTerm>1 ){. 
20040 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a       int iTerm;.
20050 20 20 20 20 20 20 66 6f 72 28 69 54 65 72 6d 3d        for(iTerm=
20060 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54  0; iTerm<pWC->nT
20070 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20  erm; iTerm++){. 
20080 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
20090 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72  pr = pWC->a[iTer
200a0 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m].pExpr;.      
200b0 20 20 69 66 28 20 26 70 57 43 2d 3e 61 5b 69 54    if( &pWC->a[iT
200c0 65 72 6d 5d 20 3d 3d 20 70 54 65 72 6d 20 29 20  erm] == pTerm ) 
200d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
200e0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
200f0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
20100 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74  FromJoin) ) cont
20110 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 74 65  inue;.        te
20120 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61 5b 69  stcase( pWC->a[i
20130 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20  Term].wtFlags & 
20140 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 3b 0a 20  TERM_ORINFO );. 
20150 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20160 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77   pWC->a[iTerm].w
20170 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
20180 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20  RTUAL );.       
20190 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 54 65 72   if( pWC->a[iTer
201a0 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m].wtFlags & (TE
201b0 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 56  RM_ORINFO|TERM_V
201c0 49 52 54 55 41 4c 29 20 29 20 63 6f 6e 74 69 6e  IRTUAL) ) contin
201d0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
201e0 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65  (pWC->a[iTerm].e
201f0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
20200 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  L)==0 ) continue
20210 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20  ;.        pExpr 
20220 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
20230 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
20240 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
20250 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
20260 64 28 64 62 2c 20 70 41 6e 64 45 78 70 72 2c 20  d(db, pAndExpr, 
20270 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
20280 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78        if( pAndEx
20290 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  pr ){.        pA
202a0 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ndExpr = sqlite3
202b0 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
202c0 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45 78 70  _AND, 0, pAndExp
202d0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
202e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 75 6e     }..    /* Run
202f0 20 61 20 73 65 70 61 72 61 74 65 20 57 48 45 52   a separate WHER
20300 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63  E clause for eac
20310 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  h term of the OR
20320 20 63 6c 61 75 73 65 2e 20 20 41 66 74 65 72 0a   clause.  After.
20330 20 20 20 20 2a 2a 20 65 6c 69 6d 69 6e 61 74 69      ** eliminati
20340 6e 67 20 64 75 70 6c 69 63 61 74 65 73 20 66 72  ng duplicates fr
20350 6f 6d 20 6f 74 68 65 72 20 57 48 45 52 45 20 63  om other WHERE c
20360 6c 61 75 73 65 73 2c 20 74 68 65 20 61 63 74 69  lauses, the acti
20370 6f 6e 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20  on for each.    
20380 2a 2a 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61  ** sub-WHERE cla
20390 75 73 65 20 69 73 20 74 6f 20 74 6f 20 69 6e 76  use is to to inv
203a0 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f  oke the main loo
203b0 70 20 62 6f 64 79 20 61 73 20 61 20 73 75 62 72  p body as a subr
203c0 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  outine..    */. 
203d0 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20     wctrlFlags = 
203e0 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e   WHERE_OMIT_OPEN
203f0 5f 43 4c 4f 53 45 0a 20 20 20 20 20 20 20 20 20  _CLOSE.         
20400 20 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f 46         | WHERE_F
20410 4f 52 43 45 5f 54 41 42 4c 45 0a 20 20 20 20 20  ORCE_TABLE.     
20420 20 20 20 20 20 20 20 20 20 20 20 7c 20 57 48 45             | WHE
20430 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
20440 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
20450 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b  ii<pOrWc->nTerm;
20460 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68   ii++){.      Wh
20470 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
20480 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d   = &pOrWc->a[ii]
20490 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
204a0 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
204b0 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65 72  =iCur || (pOrTer
204c0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
204d0 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20  O_AND)!=0 ){.   
204e0 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a       WhereInfo *
204f0 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20  pSubWInfo;      
20500 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72       /* Info for
20510 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20   single OR-term 
20520 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  scan */.        
20530 45 78 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20  Expr *pOrExpr = 
20540 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20  pOrTerm->pExpr; 
20550 2f 2a 20 43 75 72 72 65 6e 74 20 4f 52 20 63 6c  /* Current OR cl
20560 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 20  ause term */.   
20570 20 20 20 20 20 69 6e 74 20 6a 31 20 3d 20 30 3b       int j1 = 0;
20580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20590 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
205a0 6f 66 20 6a 75 6d 70 20 6f 70 65 72 61 74 69 6f  of jump operatio
205b0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  n */.        if(
205c0 20 70 41 6e 64 45 78 70 72 20 26 26 20 21 45 78   pAndExpr && !Ex
205d0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f  prHasProperty(pO
205e0 72 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rExpr, EP_FromJo
205f0 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  in) ){.         
20600 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74   pAndExpr->pLeft
20610 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20 20 20   = pOrExpr;.    
20620 20 20 20 20 20 20 70 4f 72 45 78 70 72 20 3d 20        pOrExpr = 
20630 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20 20 20  pAndExpr;.      
20640 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c    }.        /* L
20650 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c  oop through tabl
20660 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d  e entries that m
20670 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72  atch term pOrTer
20680 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 57 48  m. */.        WH
20690 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c  ERETRACE(0xffff,
206a0 20 28 22 53 75 62 70 6c 61 6e 20 66 6f 72 20 4f   ("Subplan for O
206b0 52 2d 63 6c 61 75 73 65 3a 5c 6e 22 29 29 3b 0a  R-clause:\n"));.
206c0 20 20 20 20 20 20 20 20 70 53 75 62 57 49 6e 66          pSubWInf
206d0 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
206e0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f  Begin(pParse, pO
206f0 72 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20 30  rTab, pOrExpr, 0
20700 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
20710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20720 20 20 20 20 20 20 20 20 20 20 20 77 63 74 72 6c             wctrl
20730 46 6c 61 67 73 2c 20 69 43 6f 76 43 75 72 29 3b  Flags, iCovCur);
20740 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20750 20 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50   pSubWInfo || pP
20760 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
20770 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
20780 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
20790 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  ubWInfo ){.     
207a0 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
207b0 70 53 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  pSubLoop;.      
207c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
207d0 6f 6f 70 43 6f 75 6e 74 65 72 28 76 2c 20 73 71  oopCounter(v, sq
207e0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
207f0 41 64 64 72 28 76 29 2c 20 2d 31 2c 20 2d 31 29  Addr(v), -1, -1)
20800 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c  ;.          expl
20810 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20  ainOneScan(.    
20820 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
20830 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57  , pOrTab, &pSubW
20840 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76  Info->a[0], iLev
20850 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  el, pLevel->iFro
20860 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29  m, 0.          )
20870 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;.          /* T
20880 68 69 73 20 69 73 20 74 68 65 20 73 75 62 2d 57  his is the sub-W
20890 48 45 52 45 20 63 6c 61 75 73 65 20 62 6f 64 79  HERE clause body
208a0 2e 20 20 46 69 72 73 74 20 73 6b 69 70 20 6f 76  .  First skip ov
208b0 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
208c0 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 66  duplicate rows f
208d0 72 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d 57 48  rom prior sub-WH
208e0 45 52 45 20 63 6c 61 75 73 65 73 2c 20 61 6e 64  ERE clauses, and
208f0 20 72 65 63 6f 72 64 20 74 68 65 0a 20 20 20 20   record the.    
20900 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 28        ** rowid (
20910 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 29 20  or PRIMARY KEY) 
20920 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
20930 72 6f 77 20 73 6f 20 74 68 61 74 20 74 68 65 20  row so that the 
20940 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a  same.          *
20950 2a 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 73 6b  * row will be sk
20960 69 70 70 65 64 20 69 6e 20 73 75 62 73 65 71 75  ipped in subsequ
20970 65 6e 74 20 73 75 62 2d 57 48 45 52 45 20 63 6c  ent sub-WHERE cl
20980 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 20  auses..         
20990 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
209a0 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
209b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55  Flags & WHERE_DU
209c0 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20  PLICATES_OK)==0 
209d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
209e0 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20  nt r;.          
209f0 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69    int iSet = ((i
20a00 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  i==pOrWc->nTerm-
20a10 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20  1)?-1:ii);.     
20a20 20 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f         if( HasRo
20a30 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
20a40 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73             r = s
20a50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
20a60 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
20a70 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20  pTab, -1, iCur, 
20a80 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20  regRowid, 0);.  
20a90 20 20 20 20 20 20 20 20 20 20 20 20 6a 31 20 3d              j1 =
20aa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20ab0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53  p4Int(v, OP_RowS
20ac0 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65  etTest, regRowse
20ad0 74 2c 20 30 2c 20 72 2c 69 53 65 74 29 3b 0a 20  t, 0, r,iSet);. 
20ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62               Vdb
20af0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
20b00 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
20b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49  .              I
20b20 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69  ndex *pPk = sqli
20b30 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
20b40 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
20b50 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6b 20          int nPk 
20b60 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a  = pPk->nKeyCol;.
20b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
20b80 74 20 69 50 6b 3b 0a 0a 20 20 20 20 20 20 20 20  t iPk;..        
20b90 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
20ba0 65 20 50 4b 20 69 6e 74 6f 20 61 6e 20 61 72 72  e PK into an arr
20bb0 61 79 20 6f 66 20 74 65 6d 70 20 72 65 67 69 73  ay of temp regis
20bc0 74 65 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ters. */.       
20bd0 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74         r = sqlit
20be0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
20bf0 50 61 72 73 65 2c 20 6e 50 6b 29 3b 0a 20 20 20  Parse, nPk);.   
20c00 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
20c10 50 6b 3d 30 3b 20 69 50 6b 3c 6e 50 6b 3b 20 69  Pk=0; iPk<nPk; i
20c20 50 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  Pk++){.         
20c30 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
20c40 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  = pPk->aiColumn[
20c50 69 50 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  iPk];.          
20c60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20c70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
20c80 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43 6f  Parse, pTab, iCo
20c90 6c 2c 20 69 43 75 72 2c 20 72 2b 69 50 6b 2c 20  l, iCur, r+iPk, 
20ca0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
20cb0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
20cc0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
20cd0 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 61 6c  he temp table al
20ce0 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 74  ready contains t
20cf0 68 69 73 20 6b 65 79 2e 20 49 66 20 73 6f 2c 0a  his key. If so,.
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
20d10 20 74 68 65 20 72 6f 77 20 68 61 73 20 61 6c 72   the row has alr
20d20 65 61 64 79 20 62 65 65 6e 20 69 6e 63 6c 75 64  eady been includ
20d30 65 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ed in the result
20d40 20 73 65 74 20 61 6e 64 0a 20 20 20 20 20 20 20   set and.       
20d50 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65         ** can be
20d60 20 69 67 6e 6f 72 65 64 20 28 62 79 20 6a 75 6d   ignored (by jum
20d70 70 69 6e 67 20 70 61 73 74 20 74 68 65 20 47 6f  ping past the Go
20d80 73 75 62 20 62 65 6c 6f 77 29 2e 20 4f 74 68 65  sub below). Othe
20d90 72 77 69 73 65 2c 0a 20 20 20 20 20 20 20 20 20  rwise,.         
20da0 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 74       ** insert t
20db0 68 65 20 6b 65 79 20 69 6e 74 6f 20 74 68 65 20  he key into the 
20dc0 74 65 6d 70 20 74 61 62 6c 65 20 61 6e 64 20 70  temp table and p
20dd0 72 6f 63 65 65 64 20 77 69 74 68 20 70 72 6f 63  roceed with proc
20de0 65 73 73 69 6e 67 0a 20 20 20 20 20 20 20 20 20  essing.         
20df0 20 20 20 20 20 2a 2a 20 74 68 65 20 72 6f 77 2e       ** the row.
20e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
20e10 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *.              
20e20 2a 2a 20 55 73 65 20 73 6f 6d 65 20 6f 66 20 74  ** Use some of t
20e30 68 65 20 73 61 6d 65 20 6f 70 74 69 6d 69 7a 61  he same optimiza
20e40 74 69 6f 6e 73 20 61 73 20 4f 50 5f 52 6f 77 53  tions as OP_RowS
20e50 65 74 54 65 73 74 3a 20 49 66 20 69 53 65 74 0a  etTest: If iSet.
20e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
20e70 20 69 73 20 7a 65 72 6f 2c 20 61 73 73 75 6d 65   is zero, assume
20e80 20 74 68 61 74 20 74 68 65 20 6b 65 79 20 63 61   that the key ca
20e90 6e 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 20  nnot already be 
20ea0 70 72 65 73 65 6e 74 20 69 6e 0a 20 20 20 20 20  present in.     
20eb0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
20ec0 74 65 6d 70 20 74 61 62 6c 65 2e 20 41 6e 64 20  temp table. And 
20ed0 69 66 20 69 53 65 74 20 69 73 20 2d 31 2c 20 61  if iSet is -1, a
20ee0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 72 65  ssume that there
20ef0 20 69 73 20 6e 6f 20 0a 20 20 20 20 20 20 20 20   is no .        
20f00 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f        ** need to
20f10 20 69 6e 73 65 72 74 20 74 68 65 20 6b 65 79 20   insert the key 
20f20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61  into the temp ta
20f30 62 6c 65 2c 20 61 73 20 69 74 20 77 69 6c 6c 20  ble, as it will 
20f40 6e 65 76 65 72 20 0a 20 20 20 20 20 20 20 20 20  never .         
20f50 20 20 20 20 20 2a 2a 20 62 65 20 74 65 73 74 65       ** be teste
20f60 64 20 66 6f 72 2e 20 20 2a 2f 20 0a 20 20 20 20  d for.  */ .    
20f70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 53            if( iS
20f80 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  et ){.          
20f90 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74        j1 = sqlit
20fa0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
20fb0 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 72 65 67  v, OP_Found, reg
20fc0 52 6f 77 73 65 74 2c 20 30 2c 20 72 2c 20 6e 50  Rowset, 0, r, nP
20fd0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
20fe0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
20ff0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
21000 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
21010 20 20 20 69 66 28 20 69 53 65 74 3e 3d 30 20 29     if( iSet>=0 )
21020 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21030 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21040 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
21050 63 6f 72 64 2c 20 72 2c 20 6e 50 6b 2c 20 72 65  cord, r, nPk, re
21060 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  gRowid);.       
21070 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21080 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
21090 5f 49 64 78 49 6e 73 65 72 74 2c 20 72 65 67 52  _IdxInsert, regR
210a0 6f 77 73 65 74 2c 20 72 65 67 52 6f 77 69 64 2c  owset, regRowid,
210b0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
210c0 20 20 20 20 20 69 66 28 20 69 53 65 74 20 29 20       if( iSet ) 
210d0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
210e0 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53  eP5(v, OPFLAG_US
210f0 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20  ESEEKRESULT);.  
21100 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
21110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21120 52 65 6c 65 61 73 65 20 74 68 65 20 61 72 72 61  Release the arra
21130 79 20 6f 66 20 74 65 6d 70 20 72 65 67 69 73 74  y of temp regist
21140 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ers */.         
21150 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
21160 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
21170 72 73 65 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20 20  rse, r, nPk);.  
21180 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21190 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
211a0 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65     /* Invoke the
211b0 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20   main loop body 
211c0 61 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  as a subroutine 
211d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
211e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
211f0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
21200 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79  eturn, iLoopBody
21210 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  );..          /*
21220 20 4a 75 6d 70 20 68 65 72 65 20 28 73 6b 69 70   Jump here (skip
21230 70 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 6c 6f  ping the main lo
21240 6f 70 20 62 6f 64 79 20 73 75 62 72 6f 75 74 69  op body subrouti
21250 6e 65 29 20 69 66 20 74 68 65 0a 20 20 20 20 20  ne) if the.     
21260 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20       ** current 
21270 73 75 62 2d 57 48 45 52 45 20 72 6f 77 20 69 73  sub-WHERE row is
21280 20 61 20 64 75 70 6c 69 63 61 74 65 20 66 72 6f   a duplicate fro
21290 6d 20 70 72 69 6f 72 20 73 75 62 2d 57 48 45 52  m prior sub-WHER
212a0 45 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  Es. */.         
212b0 20 69 66 28 20 6a 31 20 29 20 73 71 6c 69 74 65   if( j1 ) sqlite
212c0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
212d0 20 6a 31 29 3b 0a 0a 20 20 20 20 20 20 20 20 20   j1);..         
212e0 20 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66   /* The pSubWInf
212f0 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
21300 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74   flag means that
21310 20 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20   this OR term.  
21320 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
21330 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ined one or more
21340 20 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61   AND term from a
21350 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e   notReady table.
21360 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 20 20    The.          
21370 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68  ** terms from th
21380 65 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  e notReady table
21390 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65   could not be te
213a0 73 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20  sted and will.  
213b0 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20          ** need 
213c0 74 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61 74  to be tested lat
213d0 65 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  er..          */
213e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
213f0 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  SubWInfo->untest
21400 65 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74  edTerms ) untest
21410 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20  edTerms = 1;..  
21420 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
21430 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e  l of the OR-conn
21440 65 63 74 65 64 20 74 65 72 6d 73 20 61 72 65 20  ected terms are 
21450 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20  optimized using 
21460 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20  the same.       
21470 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64     ** index, and
21480 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f 70   the index is op
21490 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ened using the s
214a0 61 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ame cursor numbe
214b0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  r.          ** b
214c0 79 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73  y each call to s
214d0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
214e0 28 29 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  () made by this 
214f0 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20 20  loop, it may.   
21500 20 20 20 20 20 20 20 2a 2a 20 62 65 20 70 6f 73         ** be pos
21510 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68 61  sible to use tha
21520 74 20 69 6e 64 65 78 20 61 73 20 61 20 63 6f 76  t index as a cov
21530 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20  ering index..   
21540 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
21550 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61      ** If the ca
21560 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
21570 72 65 42 65 67 69 6e 28 29 20 61 62 6f 76 65 20  reBegin() above 
21580 72 65 73 75 6c 74 65 64 20 69 6e 20 61 20 73 63  resulted in a sc
21590 61 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  an that.        
215a0 20 20 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e 64    ** uses an ind
215b0 65 78 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20  ex, and this is 
215c0 65 69 74 68 65 72 20 74 68 65 20 66 69 72 73 74  either the first
215d0 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
215e0 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  rm.          ** 
215f0 70 72 6f 63 65 73 73 65 64 20 6f 72 20 74 68 65  processed or the
21600 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 73 61   index is the sa
21610 6d 65 20 61 73 20 74 68 61 74 20 75 73 65 64 20  me as that used 
21620 62 79 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a  by all previous.
21630 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72            ** ter
21640 6d 73 2c 20 73 65 74 20 70 43 6f 76 20 74 6f 20  ms, set pCov to 
21650 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 63 6f  the candidate co
21660 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74  vering index. Ot
21670 68 65 72 77 69 73 65 2c 20 73 65 74 20 0a 20 20  herwise, set .  
21680 20 20 20 20 20 20 20 20 2a 2a 20 70 43 6f 76 20          ** pCov 
21690 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63  to NULL to indic
216a0 61 74 65 20 74 68 61 74 20 6e 6f 20 63 61 6e 64  ate that no cand
216b0 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69  idate covering i
216c0 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20 20 20 20  ndex will .     
216d0 20 20 20 20 20 2a 2a 20 62 65 20 61 76 61 69 6c       ** be avail
216e0 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  able..          
216f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  */.          pSu
21700 62 4c 6f 6f 70 20 3d 20 70 53 75 62 57 49 6e 66  bLoop = pSubWInf
21710 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a  o->a[0].pWLoop;.
21720 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
21730 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46  ( (pSubLoop->wsF
21740 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
21750 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20  O_INDEX)==0 );. 
21760 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 53           if( (pS
21770 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  ubLoop->wsFlags 
21780 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
21790 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  !=0.           &
217a0 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75 62  & (ii==0 || pSub
217b0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
217c0 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20  ndex==pCov).    
217d0 20 20 20 20 20 20 20 26 26 20 28 48 61 73 52 6f         && (HasRo
217e0 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73  wid(pTab) || !Is
217f0 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
21800 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  pSubLoop->u.btre
21810 65 2e 70 49 6e 64 65 78 29 29 0a 20 20 20 20 20  e.pIndex)).     
21820 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
21830 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
21840 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78  WInfo->a[0].iIdx
21850 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a  Cur==iCovCur );.
21860 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76              pCov
21870 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62   = pSubLoop->u.b
21880 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
21890 20 20 20 20 20 20 20 20 20 77 63 74 72 6c 46 6c           wctrlFl
218a0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 4f  ags |= WHERE_REO
218b0 50 45 4e 5f 49 44 58 3b 0a 20 20 20 20 20 20 20  PEN_IDX;.       
218c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
218d0 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a        pCov = 0;.
218e0 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
218f0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68         /* Finish
21900 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67   the loop throug
21910 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
21920 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
21930 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
21940 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
21950 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29  reEnd(pSubWInfo)
21960 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21970 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c    }.    }.    pL
21980 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20  evel->u.pCovidx 
21990 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28 20  = pCov;.    if( 
219a0 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e 69  pCov ) pLevel->i
219b0 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75 72  IdxCur = iCovCur
219c0 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45 78  ;.    if( pAndEx
219d0 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e 64  pr ){.      pAnd
219e0 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b  Expr->pLeft = 0;
219f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
21a00 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 41 6e  prDelete(db, pAn
21a10 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  dExpr);.    }.  
21a20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
21a30 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69  ngeP1(v, iRetIni
21a40 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t, sqlite3VdbeCu
21a50 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20  rrentAddr(v));. 
21a60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21a70 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
21a80 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72   0, pLevel->addr
21a90 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Brk);.    sqlite
21aa0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
21ab0 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b  l(v, iLoopBody);
21ac0 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ..    if( pWInfo
21ad0 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c  ->nLevel>1 ) sql
21ae0 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64 62  ite3StackFree(db
21af0 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20 69  , pOrTab);.    i
21b00 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72 6d  f( !untestedTerm
21b10 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d 28  s ) disableTerm(
21b20 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
21b30 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
21b40 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  * SQLITE_OMIT_OR
21b50 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
21b60 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73  ..  {.    /* Cas
21b70 65 20 36 3a 20 20 54 68 65 72 65 20 69 73 20 6e  e 6:  There is n
21b80 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20  o usable index. 
21b90 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f   We must do a co
21ba0 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20 20  mplete.    **   
21bb0 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74         scan of t
21bc0 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e  he entire table.
21bd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74  .    */.    stat
21be0 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 65  ic const u8 aSte
21bf0 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c  p[] = { OP_Next,
21c00 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20   OP_Prev };.    
21c10 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
21c20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f  aStart[] = { OP_
21c30 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20  Rewind, OP_Last 
21c40 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62  };.    assert( b
21c50 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d  Rev==0 || bRev==
21c60 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  1 );.    if( pTa
21c70 62 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73 69  bItem->isRecursi
21c80 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ve ){.      /* T
21c90 61 62 6c 65 73 20 6d 61 72 6b 65 64 20 69 73 52  ables marked isR
21ca0 65 63 75 72 73 69 76 65 20 68 61 76 65 20 6f 6e  ecursive have on
21cb0 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ly a single row 
21cc0 74 68 61 74 20 69 73 20 73 74 6f 72 65 64 20 69  that is stored i
21cd0 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 70 73 65  n.      ** a pse
21ce0 75 64 6f 2d 63 75 72 73 6f 72 2e 20 20 4e 6f 20  udo-cursor.  No 
21cf0 6e 65 65 64 20 74 6f 20 52 65 77 69 6e 64 20 6f  need to Rewind o
21d00 72 20 4e 65 78 74 20 73 75 63 68 20 63 75 72 73  r Next such curs
21d10 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4c  ors. */.      pL
21d20 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
21d30 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  op;.    }else{. 
21d40 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
21d50 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20  = aStep[bRev];. 
21d60 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
21d70 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c  = iCur;.      pL
21d80 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73  evel->p2 = 1 + s
21d90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21da0 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d  (v, aStart[bRev]
21db0 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
21dc0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
21dd0 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d  rageIf(v, bRev==
21de0 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  0);.      VdbeCo
21df0 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
21e00 21 3d 30 29 3b 0a 20 20 20 20 20 20 70 4c 65 76  !=0);.      pLev
21e10 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f  el->p5 = SQLITE_
21e20 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
21e30 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 0a  CAN_STEP;.    }.
21e40 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64    }..#if defined
21e50 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26  (SQLITE_DEBUG) &
21e60 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
21e70 5f 45 4e 41 42 4c 45 5f 4c 4f 4f 50 43 4f 55 4e  _ENABLE_LOOPCOUN
21e80 54 45 52 53 29 0a 20 20 61 64 64 72 54 65 73 74  TERS).  addrTest
21e90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
21ea0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 23 65  rrentAddr(v);.#e
21eb0 6e 64 69 66 20 0a 0a 20 20 2f 2a 20 49 6e 73 65  ndif ..  /* Inse
21ec0 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
21ed0 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73  every subexpress
21ee0 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20  ion that can be 
21ef0 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20  completely.  ** 
21f00 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74  computed using t
21f10 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f  he current set o
21f20 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  f tables..  */. 
21f30 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
21f40 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, j=pWC->nTerm;
21f50 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d   j>0; j--, pTerm
21f60 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
21f70 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  E;.    testcase(
21f80 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
21f90 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
21fa0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
21fb0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
21fc0 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
21fd0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
21fe0 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
21ff0 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
22000 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
22010 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
22020 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c  ereqAll & pLevel
22030 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  ->notReady)!=0 )
22040 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
22050 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
22060 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20  edTerms==0.     
22070 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57            && (pW
22080 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
22090 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
220a0 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20  E_ONLY)!=0 );.  
220b0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65      pWInfo->unte
220c0 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20  stedTerms = 1;. 
220d0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
220e0 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54     }.    pE = pT
220f0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
22100 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b  assert( pE!=0 );
22110 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
22120 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45  >iLeftJoin && !E
22130 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
22140 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  E, EP_FromJoin) 
22150 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
22160 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  e;.    }.    sql
22170 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
22180 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72  pParse, pE, addr
22190 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
221a0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54  PIFNULL);.    pT
221b0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
221c0 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a  TERM_CODED;.  }.
221d0 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64  .  /* Insert cod
221e0 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d  e to test for im
221f0 70 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  plied constraint
22200 73 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73  s based on trans
22210 69 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20  itivity.  ** of 
22220 74 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f  the "==" operato
22230 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61  r..  **.  ** Exa
22240 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45  mple: If the WHE
22250 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  RE clause contai
22260 6e 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61  ns "t1.a=t2.b" a
22270 6e 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20  nd "t2.b=123".  
22280 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f  ** and we are co
22290 64 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70  ding the t1 loop
222a0 20 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70   and the t2 loop
222b0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64   has not yet cod
222c0 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65  ed,.  ** then we
222d0 20 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20   cannot use the 
222e0 22 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73  "t1.a=t2.b" cons
222f0 74 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63  traint, but we c
22300 61 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65  an code.  ** the
22310 20 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31   implied "t1.a=1
22320 32 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  23" constraint..
22330 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d    */.  for(pTerm
22340 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e  =pWC->a, j=pWC->
22350 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  nTerm; j>0; j--,
22360 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
22370 78 70 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b  xpr *pE, *pEAlt;
22380 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
22390 70 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54  pAlt;.    if( pT
223a0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
223b0 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
223c0 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
223d0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
223e0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28  rm->eOperator!=(
223f0 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29 20  WO_EQUIV|WO_EQ) 
22400 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22410 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
22420 75 72 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f  ursor!=iCur ) co
22430 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
22440 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
22450 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
22460 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pE = pTerm->pE
22470 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
22480 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
22490 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
224a0 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  n) );.    assert
224b0 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
224c0 52 69 67 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e  Right & pLevel->
224d0 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a  notReady)!=0 );.
224e0 20 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54      pAlt = findT
224f0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70  erm(pWC, iCur, p
22500 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
22510 6d 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  mn, notReady, WO
22520 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20  _EQ|WO_IN, 0);. 
22530 20 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29     if( pAlt==0 )
22540 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
22550 66 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73  f( pAlt->wtFlags
22560 20 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20   & (TERM_CODED) 
22570 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22580 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e  testcase( pAlt->
22590 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
225a0 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Q );.    testcas
225b0 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74  e( pAlt->eOperat
225c0 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
225d0 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
225e0 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74  ent((v, "begin t
225f0 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72  ransitive constr
22600 61 69 6e 74 22 29 29 3b 0a 20 20 20 20 70 45 41  aint"));.    pEA
22610 6c 74 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63  lt = sqlite3Stac
22620 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  kAllocRaw(db, si
22630 7a 65 6f 66 28 2a 70 45 41 6c 74 29 29 3b 0a 20  zeof(*pEAlt));. 
22640 20 20 20 69 66 28 20 70 45 41 6c 74 20 29 7b 0a     if( pEAlt ){.
22650 20 20 20 20 20 20 2a 70 45 41 6c 74 20 3d 20 2a        *pEAlt = *
22660 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20  pAlt->pExpr;.   
22670 20 20 20 70 45 41 6c 74 2d 3e 70 4c 65 66 74 20     pEAlt->pLeft 
22680 3d 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  = pE->pLeft;.   
22690 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
226a0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
226b0 41 6c 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53  Alt, addrCont, S
226c0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
226d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
226e0 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 45  StackFree(db, pE
226f0 41 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Alt);.    }.  }.
22700 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54  .  /* For a LEFT
22710 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e   OUTER JOIN, gen
22720 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
22730 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20  will record the 
22740 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61  fact that.  ** a
22750 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20  t least one row 
22760 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
22770 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74  le has matched t
22780 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20  he left table.  
22790 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76  .  */.  if( pLev
227a0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
227b0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64  .    pLevel->add
227c0 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
227d0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
227e0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
227f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22800 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76  Integer, 1, pLev
22810 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
22820 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22830 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54  (v, "record LEFT
22840 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20   JOIN hit"));.  
22850 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
22860 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
22870 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
22880 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57  WC->a, j=0; j<pW
22890 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70  C->nTerm; j++, p
228a0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74  Term++){.      t
228b0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
228c0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
228d0 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
228e0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
228f0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
22900 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69  CODED );.      i
22910 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
22920 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
22930 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
22940 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
22950 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
22960 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e  eqAll & pLevel->
22970 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a  notReady)!=0 ){.
22980 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22990 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
229a0 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20  Terms );.       
229b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
229c0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
229d0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b   pTerm->pExpr );
229e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
229f0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
22a00 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
22a10 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
22a20 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
22a30 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
22a40 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
22a50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
22a60 66 28 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67  f( pParse->pTrig
22a70 67 65 72 54 61 62 3d 3d 30 20 26 26 20 30 3d 3d  gerTab==0 && 0==
22a80 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
22a90 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
22aa0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
22ab0 56 64 62 65 4c 6f 6f 70 43 6f 75 6e 74 65 72 28  VdbeLoopCounter(
22ac0 76 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20  v, addrExplain, 
22ad0 61 64 64 72 54 65 73 74 2c 20 73 71 6c 69 74 65  addrTest, sqlite
22ae0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
22af0 28 76 29 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  (v));.  }..  ret
22b00 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  urn pLevel->notR
22b10 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  eady;.}..#ifdef 
22b20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
22b30 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  ED./*.** Print t
22b40 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
22b50 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74  WhereTerm object
22b60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22b70 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 57  whereTermPrint(W
22b80 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
22b90 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a 20 20 69   int iTerm){.  i
22ba0 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20  f( pTerm==0 ){. 
22bb0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
22bc0 72 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d 33 64  rintf("TERM-%-3d
22bd0 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d 29   NULL\n", iTerm)
22be0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
22bf0 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20  har zType[4];.  
22c00 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20    memcpy(zType, 
22c10 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20 20 69  "...", 4);.    i
22c20 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
22c30 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
22c40 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56   ) zType[0] = 'V
22c50 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ';.    if( pTerm
22c60 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
22c70 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70 65 5b  _EQUIV  ) zType[
22c80 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20 69 66  1] = 'E';.    if
22c90 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
22ca0 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
22cb0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a  EP_FromJoin) ) z
22cc0 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20  Type[2] = 'L';. 
22cd0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
22ce0 72 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d 33 64  rintf("TERM-%-3d
22cf0 20 25 70 20 25 73 20 63 75 72 73 6f 72 3d 25 2d   %p %s cursor=%-
22d00 33 64 20 70 72 6f 62 3d 25 2d 33 64 20 6f 70 3d  3d prob=%-3d op=
22d10 30 78 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20  0x%03x\n",.     
22d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d30 20 20 69 54 65 72 6d 2c 20 70 54 65 72 6d 2c 20    iTerm, pTerm, 
22d40 7a 54 79 70 65 2c 20 70 54 65 72 6d 2d 3e 6c 65  zType, pTerm->le
22d50 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72 6d 2d  ftCursor, pTerm-
22d60 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20 20 20 20  >truthProb,.    
22d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d80 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
22d90 74 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tor);.    sqlite
22da0 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c  3TreeViewExpr(0,
22db0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30   pTerm->pExpr, 0
22dc0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
22dd0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
22de0 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a  CE_ENABLED./*.**
22df0 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c 6f   Print a WhereLo
22e00 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64 65  op object for de
22e10 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73  bugging purposes
22e20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22e30 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57  whereLoopPrint(W
22e40 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65  hereLoop *p, Whe
22e50 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a  reClause *pWC){.
22e60 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
22e70 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
22e80 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b  o;.  int nb = 1+
22e90 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  (pWInfo->pTabLis
22ea0 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20 20  t->nSrc+7)/8;.  
22eb0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22ec0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57 49  tem *pItem = pWI
22ed0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
22ee0 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61   + p->iTab;.  Ta
22ef0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65  ble *pTab = pIte
22f00 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  m->pTab;.  sqlit
22f10 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
22f20 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c  c%2d.%0*llx.%0*l
22f30 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20  lx", p->cId,.   
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f50 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70    p->iTab, nb, p
22f60 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20  ->maskSelf, nb, 
22f70 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73 71  p->prereq);.  sq
22f80 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
22f90 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20 20  (" %12s",.      
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22fb0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70  Item->zAlias ? p
22fc0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70  Item->zAlias : p
22fd0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  Tab->zName);.  i
22fe0 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
22ff0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
23000 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  BLE)==0 ){.    c
23010 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
23020 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 62  ;.    if( p->u.b
23030 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26 20 28  tree.pIndex && (
23040 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72  zName = p->u.btr
23050 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ee.pIndex->zName
23060 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
23070 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c  ( strncmp(zName,
23080 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
23090 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a  ex_", 17)==0 ){.
230a0 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20          int i = 
230b0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
230c0 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20  zName) - 1;.    
230d0 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65      while( zName
230e0 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a  [i]!='_' ) i--;.
230f0 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d          zName +=
23100 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
23110 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23120 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32 64  intf(".%-16s %2d
23130 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62  ", zName, p->u.b
23140 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d  tree.nEq);.    }
23150 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
23160 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23170 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d  %20s","");.    }
23180 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
23190 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70  ar *z;.    if( p
231a0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
231b0 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  ){.      z = sql
231c0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25  ite3_mprintf("(%
231d0 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20  d,\"%s\",%x)",. 
231e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
231f0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c  ->u.vtab.idxNum,
23200 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74   p->u.vtab.idxSt
23210 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  r, p->u.vtab.omi
23220 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73  tMask);.    }els
23230 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  e{.      z = sql
23240 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25  ite3_mprintf("(%
23250 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61  d,%x)", p->u.vta
23260 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
23270 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20  tab.omitMask);. 
23280 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
23290 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 2d  DebugPrintf(" %-
232a0 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71  19s", z);.    sq
232b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
232c0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c   }.  if( p->wsFl
232d0 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50  ags & WHERE_SKIP
232e0 53 43 41 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  SCAN ){.    sqli
232f0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23300 20 66 20 25 30 35 78 20 25 64 2d 25 64 22 2c 20   f %05x %d-%d", 
23310 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e  p->wsFlags, p->n
23320 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29 3b  LTerm,p->nSkip);
23330 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
23340 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23350 28 22 20 66 20 25 30 35 78 20 4e 20 25 64 22 2c  (" f %05x N %d",
23360 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e   p->wsFlags, p->
23370 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 73  nLTerm);.  }.  s
23380 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
23390 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25  f(" cost %d,%d,%
233a0 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c  d\n", p->rSetup,
233b0 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75   p->rRun, p->nOu
233c0 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54  t);.  if( p->nLT
233d0 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33 57  erm && (sqlite3W
233e0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31 30  hereTrace & 0x10
233f0 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  0)!=0 ){.    int
23400 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
23410 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b   i<p->nLTerm; i+
23420 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 54  +){.      whereT
23430 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c 54 65  ermPrint(p->aLTe
23440 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d  rm[i], i);.    }
23450 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
23460 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c  *.** Convert bul
23470 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20  k memory into a 
23480 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70 20  valid WhereLoop 
23490 74 68 61 74 20 63 61 6e 20 62 65 20 70 61 73 73  that can be pass
234a0 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f  ed.** to whereLo
234b0 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73 73  opClear harmless
234c0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
234d0 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  id whereLoopInit
234e0 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a  (WhereLoop *p){.
234f0 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d    p->aLTerm = p-
23500 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20  >aLTermSpace;.  
23510 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  p->nLTerm = 0;. 
23520 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72   p->nLSlot = Arr
23530 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d  aySize(p->aLTerm
23540 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46  Space);.  p->wsF
23550 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  lags = 0;.}../*.
23560 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68 65  ** Clear the Whe
23570 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20  reLoop.u union. 
23580 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f 70   Leave WhereLoop
23590 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a  .pLTerm intact..
235a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
235b0 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
235c0 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  on(sqlite3 *db, 
235d0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
235e0 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20   if( p->wsFlags 
235f0 26 20 28 57 48 45 52 45 5f 56 49 52 54 55 41 4c  & (WHERE_VIRTUAL
23600 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f  TABLE|WHERE_AUTO
23610 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 69  _INDEX) ){.    i
23620 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
23630 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
23640 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e  BLE)!=0 && p->u.
23650 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
23660 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
23670 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64  ree(p->u.vtab.id
23680 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  xStr);.      p->
23690 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
236a0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  = 0;.      p->u.
236b0 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b  vtab.idxStr = 0;
236c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
236d0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
236e0 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
236f0 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e  0 && p->u.btree.
23700 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20  pIndex!=0 ){.   
23710 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
23720 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  (db, p->u.btree.
23730 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29  pIndex->zColAff)
23740 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b  ;.      sqlite3K
23750 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 2d 3e 75  eyInfoUnref(p->u
23760 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 70  .btree.pIndex->p
23770 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  KeyInfo);.      
23780 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23790 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  , p->u.btree.pIn
237a0 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75  dex);.      p->u
237b0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
237c0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
237d0 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
237e0 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79   internal memory
237f0 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72 65   used by a Where
23800 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
23810 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
23820 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74 65  LoopClear(sqlite
23830 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
23840 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61   *p){.  if( p->a
23850 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d  LTerm!=p->aLTerm
23860 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33 44  Space ) sqlite3D
23870 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54  bFree(db, p->aLT
23880 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  erm);.  whereLoo
23890 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20  pClearUnion(db, 
238a0 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49  p);.  whereLoopI
238b0 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nit(p);.}../*.**
238c0 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d 65   Increase the me
238d0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
238e0 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  for pLoop->aLTer
238f0 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65 61  m[] to be at lea
23900 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  st n..*/.static 
23910 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  int whereLoopRes
23920 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ize(sqlite3 *db,
23930 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69   WhereLoop *p, i
23940 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54 65  nt n){.  WhereTe
23950 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66  rm **paNew;.  if
23960 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29  ( p->nLSlot>=n )
23970 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23980 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e  K;.  n = (n+7)&~
23990 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71 6c  7;.  paNew = sql
239a0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
239b0 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  db, sizeof(p->aL
239c0 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69  Term[0])*n);.  i
239d0 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65  f( paNew==0 ) re
239e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
239f0 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65  M;.  memcpy(paNe
23a00 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69  w, p->aLTerm, si
23a10 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30  zeof(p->aLTerm[0
23a20 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20  ])*p->nLSlot);. 
23a30 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
23a40 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
23a50 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
23a60 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
23a70 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e   p->aLTerm = paN
23a80 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20  ew;.  p->nLSlot 
23a90 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = n;.  return SQ
23aa0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
23ab0 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65  * Transfer conte
23ac0 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  nt from the seco
23ad0 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68  nd pLoop into th
23ae0 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74  e first..*/.stat
23af0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
23b00 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  Xfer(sqlite3 *db
23b10 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f  , WhereLoop *pTo
23b20 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72  , WhereLoop *pFr
23b30 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  om){.  whereLoop
23b40 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70  ClearUnion(db, p
23b50 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65  To);.  if( where
23b60 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
23b70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72  To, pFrom->nLTer
23b80 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  m) ){.    memset
23b90 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a  (&pTo->u, 0, siz
23ba0 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20  eof(pTo->u));.  
23bb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23bc0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
23bd0 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20  cpy(pTo, pFrom, 
23be0 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f  WHERE_LOOP_XFER_
23bf0 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  SZ);.  memcpy(pT
23c00 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d  o->aLTerm, pFrom
23c10 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e  ->aLTerm, pTo->n
23c20 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f  LTerm*sizeof(pTo
23c30 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20  ->aLTerm[0]));. 
23c40 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c   if( pFrom->wsFl
23c50 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
23c60 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20  UALTABLE ){.    
23c70 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65  pFrom->u.vtab.ne
23c80 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  edFree = 0;.  }e
23c90 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e  lse if( (pFrom->
23ca0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
23cb0 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
23cc0 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62  {.    pFrom->u.b
23cd0 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
23ce0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
23cf0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
23d00 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65 72 65  * Delete a Where
23d10 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
23d20 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
23d30 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69 74  LoopDelete(sqlit
23d40 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
23d50 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f  p *p){.  whereLo
23d60 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a  opClear(db, p);.
23d70 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
23d80 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
23d90 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66   Free a WhereInf
23da0 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73  o structure.*/.s
23db0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
23dc0 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33  InfoFree(sqlite3
23dd0 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20   *db, WhereInfo 
23de0 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20  *pWInfo){.  if( 
23df0 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29  ALWAYS(pWInfo) )
23e00 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
23e10 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e  eClear(&pWInfo->
23e20 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  sWC);.    while(
23e30 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
23e40 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f  ){.      WhereLo
23e50 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  op *p = pWInfo->
23e60 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57  pLoops;.      pW
23e70 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70  Info->pLoops = p
23e80 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
23e90 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65     whereLoopDele
23ea0 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d  te(db, p);.    }
23eb0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
23ec0 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
23ed0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
23ee0 75 72 6e 20 54 52 55 45 20 69 66 20 62 6f 74 68  urn TRUE if both
23ef0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
23f00 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
23f10 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20 74  *   (1)  X has t
23f20 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
23f30 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20   cost that Y.** 
23f40 20 20 28 32 29 20 20 58 20 69 73 20 61 20 70 72    (2)  X is a pr
23f50 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
23f60 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f 70 65  .**.** By "prope
23f70 72 20 73 75 62 73 65 74 22 20 77 65 20 6d 65 61  r subset" we mea
23f80 6e 20 74 68 61 74 20 58 20 75 73 65 73 20 66 65  n that X uses fe
23f90 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  wer WHERE clause
23fa0 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e 20 59   terms.** than Y
23fb0 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79 20   and that every 
23fc0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
23fd0 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 20 61  m used by X is a
23fe0 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79 20 59  lso used.** by Y
23ff0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20  ..**.** If X is 
24000 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
24010 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73 20 61  of Y then Y is a
24020 20 62 65 74 74 65 72 20 63 68 6f 69 63 65 20 61   better choice a
24030 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68  nd ought.** to h
24040 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74  ave a lower cost
24050 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
24060 72 65 74 75 72 6e 73 20 54 52 55 45 20 77 68 65  returns TRUE whe
24070 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20  n that cost .** 
24080 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73 20  relationship is 
24090 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65 65  inverted and nee
240a0 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65  ds to be adjuste
240b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
240c0 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65   whereLoopCheape
240d0 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 0a 20  rProperSubset(. 
240e0 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
240f0 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a 20 46   *pX,       /* F
24100 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 74  irst WhereLoop t
24110 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63  o compare */.  c
24120 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
24130 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  pY        /* Com
24140 70 61 72 65 20 61 67 61 69 6e 73 74 20 74 68 69  pare against thi
24150 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29  s WhereLoop */.)
24160 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
24170 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70  if( pX->nLTerm-p
24180 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59 2d 3e  X->nSkip >= pY->
24190 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70  nLTerm-pY->nSkip
241a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
241b0 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20 61 20  ; /* X is not a 
241c0 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f 0a 20  subset of Y */. 
241d0 20 7d 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75   }.  if( pX->rRu
241e0 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b  n >= pY->rRun ){
241f0 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75  .    if( pX->rRu
24200 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72  n > pY->rRun ) r
24210 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58  eturn 0;    /* X
24220 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
24230 20 59 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58   Y */.    if( pX
24240 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75  ->nOut > pY->nOu
24250 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
24260 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65   /* X costs more
24270 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20   than Y */.  }. 
24280 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72   for(i=pX->nLTer
24290 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  m-1; i>=0; i--){
242a0 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 61 4c 54  .    if( pX->aLT
242b0 65 72 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  erm[i]==0 ) cont
242c0 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  inue;.    for(j=
242d0 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e  pY->nLTerm-1; j>
242e0 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; j--){.      
242f0 69 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a  if( pY->aLTerm[j
24300 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d  ]==pX->aLTerm[i]
24310 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
24320 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65      if( j<0 ) re
24330 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f  turn 0;  /* X no
24340 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20  t a subset of Y 
24350 73 69 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20  since term X[i] 
24360 6e 6f 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f  not used by Y */
24370 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
24380 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69    /* All conditi
24390 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f  ons meet */.}../
243a0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 61 64 6a 75  *.** Try to adju
243b0 73 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 57  st the cost of W
243c0 68 65 72 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61  hereLoop pTempla
243d0 74 65 20 75 70 77 61 72 64 73 20 6f 72 20 64 6f  te upwards or do
243e0 77 6e 77 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68  wnwards so.** th
243f0 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  at:.**.**   (1) 
24400 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20  pTemplate costs 
24410 6c 65 73 73 20 74 68 61 6e 20 61 6e 79 20 6f 74  less than any ot
24420 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 74  her WhereLoops t
24430 68 61 74 20 61 72 65 20 61 20 70 72 6f 70 65 72  hat are a proper
24440 0a 2a 2a 20 20 20 20 20 20 20 73 75 62 73 65 74  .**       subset
24450 20 6f 66 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a   of pTemplate.**
24460 0a 2a 2a 20 20 20 28 32 29 20 70 54 65 6d 70 6c  .**   (2) pTempl
24470 61 74 65 20 63 6f 73 74 73 20 6d 6f 72 65 20 74  ate costs more t
24480 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68  han any other Wh
24490 65 72 65 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69  ereLoops for whi
244a0 63 68 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20  ch pTemplate.** 
244b0 20 20 20 20 20 20 69 73 20 61 20 70 72 6f 70 65        is a prope
244c0 72 20 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  r subset..**.** 
244d0 54 6f 20 73 61 79 20 22 57 68 65 72 65 4c 6f 6f  To say "WhereLoo
244e0 70 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20  p X is a proper 
244f0 73 75 62 73 65 74 20 6f 66 20 59 22 20 6d 65 61  subset of Y" mea
24500 6e 73 20 74 68 61 74 20 58 20 75 73 65 73 20 66  ns that X uses f
24510 65 77 65 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c  ewer.** WHERE cl
24520 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20  ause terms than 
24530 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79  Y and that every
24540 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
24550 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 0a  rm used by X is.
24560 2a 2a 20 61 6c 73 6f 20 75 73 65 64 20 62 79 20  ** also used by 
24570 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  Y..*/.static voi
24580 64 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73  d whereLoopAdjus
24590 74 43 6f 73 74 28 63 6f 6e 73 74 20 57 68 65 72  tCost(const Wher
245a0 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c  eLoop *p, WhereL
245b0 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
245c0 0a 20 20 69 66 28 20 28 70 54 65 6d 70 6c 61 74  .  if( (pTemplat
245d0 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
245e0 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29  RE_INDEXED)==0 )
245f0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b   return;.  for(;
24600 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f   p; p=p->pNextLo
24610 6f 70 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  op){.    if( p->
24620 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d  iTab!=pTemplate-
24630 3e 69 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65  >iTab ) continue
24640 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73  ;.    if( (p->ws
24650 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
24660 44 45 58 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74  DEXED)==0 ) cont
24670 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 77 68  inue;.    if( wh
24680 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72  ereLoopCheaperPr
24690 6f 70 65 72 53 75 62 73 65 74 28 70 2c 20 70 54  operSubset(p, pT
246a0 65 6d 70 6c 61 74 65 29 20 29 7b 0a 20 20 20 20  emplate) ){.    
246b0 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d    /* Adjust pTem
246c0 70 6c 61 74 65 20 63 6f 73 74 20 64 6f 77 6e 77  plate cost downw
246d0 61 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69  ard so that it i
246e0 73 20 63 68 65 61 70 65 72 20 74 68 61 6e 20 69  s cheaper than i
246f0 74 73 20 0a 20 20 20 20 20 20 2a 2a 20 73 75 62  ts .      ** sub
24700 73 65 74 20 70 2e 20 20 45 78 63 65 70 74 2c 20  set p.  Except, 
24710 64 6f 20 6e 6f 74 20 61 64 6a 75 73 74 20 74 68  do not adjust th
24720 65 20 63 6f 73 74 20 65 73 74 69 6d 61 74 65 20  e cost estimate 
24730 64 6f 77 6e 77 61 72 64 20 66 6f 72 0a 20 20 20  downward for.   
24740 20 20 20 2a 2a 20 61 20 6c 6f 6f 70 20 74 68 61     ** a loop tha
24750 74 20 73 6b 69 70 73 20 6d 6f 72 65 20 63 6f 6c  t skips more col
24760 75 6d 6e 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69  umns. */.      i
24770 66 28 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 53  f( pTemplate->nS
24780 6b 69 70 3e 70 2d 3e 6e 53 6b 69 70 20 29 20 63  kip>p->nSkip ) c
24790 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 57  ontinue;.      W
247a0 48 45 52 45 54 52 41 43 45 28 30 78 38 30 2c 28  HERETRACE(0x80,(
247b0 22 73 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a  "subset cost adj
247c0 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f  ustment %d,%d to
247d0 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d,%d\n",.     
247e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247f0 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75    pTemplate->rRu
24800 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  n, pTemplate->nO
24810 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e  ut, p->rRun, p->
24820 6e 4f 75 74 2d 31 29 29 3b 0a 20 20 20 20 20 20  nOut-1));.      
24830 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
24840 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20  = p->rRun;.     
24850 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74   pTemplate->nOut
24860 20 3d 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a   = p->nOut - 1;.
24870 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68      }else if( wh
24880 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72  ereLoopCheaperPr
24890 6f 70 65 72 53 75 62 73 65 74 28 70 54 65 6d 70  operSubset(pTemp
248a0 6c 61 74 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  late, p) ){.    
248b0 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d    /* Adjust pTem
248c0 70 6c 61 74 65 20 63 6f 73 74 20 75 70 77 61 72  plate cost upwar
248d0 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  d so that it is 
248e0 63 6f 73 74 6c 69 65 72 20 74 68 61 6e 20 70 20  costlier than p 
248f0 73 69 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 70  since.      ** p
24900 54 65 6d 70 6c 61 74 65 20 69 73 20 61 20 70 72  Template is a pr
24910 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 70  oper subset of p
24920 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54   */.      WHERET
24930 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62 73  RACE(0x80,("subs
24940 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65  et cost adjustme
24950 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25  nt %d,%d to %d,%
24960 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
24970 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
24980 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54  mplate->rRun, pT
24990 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70  emplate->nOut, p
249a0 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b  ->rRun, p->nOut+
249b0 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  1));.      pTemp
249c0 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e  late->rRun = p->
249d0 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d  rRun;.      pTem
249e0 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d  plate->nOut = p-
249f0 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20 7d  >nOut + 1;.    }
24a00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
24a10 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 6f 66  arch the list of
24a20 20 57 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20 2a   WhereLoops in *
24a30 70 70 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20 66  ppPrev looking f
24a40 6f 72 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20  or one that can 
24a50 62 65 0a 2a 2a 20 73 75 70 70 6c 61 6e 74 65 64  be.** supplanted
24a60 20 62 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a   by pTemplate..*
24a70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  *.** Return NULL
24a80 20 69 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   if the WhereLoo
24a90 70 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  p list contains 
24aa0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 61  an entry that ca
24ab0 6e 20 73 75 70 70 6c 61 6e 74 0a 2a 2a 20 70 54  n supplant.** pT
24ac0 65 6d 70 6c 61 74 65 2c 20 69 6e 20 6f 74 68 65  emplate, in othe
24ad0 72 20 77 6f 72 64 73 20 69 66 20 70 54 65 6d 70  r words if pTemp
24ae0 6c 61 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65  late does not be
24af0 6c 6f 6e 67 20 6f 6e 20 74 68 65 20 6c 69 73 74  long on the list
24b00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69 73  ..**.** If pX is
24b10 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61   a WhereLoop tha
24b20 74 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20  t pTemplate can 
24b30 73 75 70 70 6c 61 6e 74 2c 20 74 68 65 6e 20 72  supplant, then r
24b40 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e  eturn the.** lin
24b50 6b 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  k that points to
24b60 20 70 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54   pX..**.** If pT
24b70 65 6d 70 6c 61 74 65 20 63 61 6e 6e 6f 74 20 73  emplate cannot s
24b80 75 70 70 6c 61 6e 74 20 61 6e 79 20 65 78 69 73  upplant any exis
24b90 74 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20  ting element of 
24ba0 74 68 65 20 6c 69 73 74 20 62 75 74 20 6e 65 65  the list but nee
24bb0 64 73 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64 65  ds.** to be adde
24bc0 64 20 74 6f 20 74 68 65 20 6c 69 73 74 2c 20 74  d to the list, t
24bd0 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
24be0 6e 74 65 72 20 74 6f 20 74 68 65 20 74 61 69 6c  nter to the tail
24bf0 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   of the list..*/
24c00 0a 73 74 61 74 69 63 20 57 68 65 72 65 4c 6f 6f  .static WhereLoo
24c10 70 20 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69 6e  p **whereLoopFin
24c20 64 4c 65 73 73 65 72 28 0a 20 20 57 68 65 72 65  dLesser(.  Where
24c30 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a 20  Loop **ppPrev,. 
24c40 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
24c50 20 2a 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a 20   *pTemplate.){. 
24c60 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20   WhereLoop *p;. 
24c70 20 66 6f 72 28 70 3d 28 2a 70 70 50 72 65 76 29   for(p=(*ppPrev)
24c80 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e  ; p; ppPrev=&p->
24c90 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70  pNextLoop, p=*pp
24ca0 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70  Prev){.    if( p
24cb0 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74  ->iTab!=pTemplat
24cc0 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53  e->iTab || p->iS
24cd0 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74  ortIdx!=pTemplat
24ce0 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a 20  e->iSortIdx ){. 
24cf0 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65       /* If eithe
24d00 72 20 74 68 65 20 69 54 61 62 20 6f 72 20 69 53  r the iTab or iS
24d10 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20 66 6f  ortIdx values fo
24d20 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20  r two WhereLoop 
24d30 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20  are different.  
24d40 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73      ** then thos
24d50 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65  e WhereLoops nee
24d60 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72  d to be consider
24d70 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
24d80 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20 20 20  Neither is.     
24d90 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74 65 20   ** a candidate 
24da0 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f  to replace the o
24db0 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63  ther. */.      c
24dc0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
24dd0 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72     /* In the cur
24de0 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
24df0 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75 70 20  ion, the rSetup 
24e00 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20  value is either 
24e10 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74  zero.    ** or t
24e20 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69 6c 64  he cost of build
24e30 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
24e40 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61   index (NlogN) a
24e50 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20  nd the NlogN.   
24e60 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20   ** is the same 
24e70 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65 20 57  for compatible W
24e80 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20  hereLoops. */.  
24e90 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65    assert( p->rSe
24ea0 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c  tup==0 || pTempl
24eb0 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a  ate->rSetup==0 .
24ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ed0 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70   || p->rSetup==p
24ee0 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
24ef0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72   );..    /* wher
24f00 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 29 20  eLoopAddBtree() 
24f10 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74 65 73  always generates
24f20 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74 68 65   and inserts the
24f30 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
24f40 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66 69 72  .    ** case fir
24f50 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70 61  st.  Hence compa
24f60 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74 65 20  tible candidate 
24f70 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72  WhereLoops never
24f80 20 68 61 76 65 20 61 20 6c 61 72 67 65 72 0a 20   have a larger. 
24f90 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20 43 61     ** rSetup. Ca
24fa0 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d 49 4e  ll this SETUP-IN
24fb0 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61  VARIANT */.    a
24fc0 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
24fd0 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  >=pTemplate->rSe
24fe0 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  tup );..    /* A
24ff0 6e 79 20 6c 6f 6f 70 20 75 73 69 6e 67 20 61 6e  ny loop using an
25000 20 61 70 70 6c 69 61 74 69 6f 6e 2d 64 65 66 69   appliation-defi
25010 6e 65 64 20 69 6e 64 65 78 20 28 6f 72 20 50 52  ned index (or PR
25020 49 4d 41 52 59 20 4b 45 59 20 6f 72 0a 20 20 20  IMARY KEY or.   
25030 20 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   ** UNIQUE const
25040 72 61 69 6e 74 29 20 77 69 74 68 20 6f 6e 65 20  raint) with one 
25050 6f 72 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73 74  or more == const
25060 72 61 69 6e 74 73 20 69 73 20 62 65 74 74 65 72  raints is better
25070 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 61 6e 20  .    ** than an 
25080 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
25090 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   */.    if( (p->
250a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
250b0 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a 20  AUTO_INDEX)!=0. 
250c0 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74      && (pTemplat
250d0 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
250e0 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
250f0 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74      && (pTemplat
25100 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
25110 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30  RE_COLUMN_EQ)!=0
25120 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 70 72 65  .     && (p->pre
25130 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d  req & pTemplate-
25140 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c  >prereq)==pTempl
25150 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20  ate->prereq.    
25160 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
25170 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
25180 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
25190 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20  oop p is better 
251a0 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20  than pTemplate, 
251b0 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 62 65  pTemplate can be
251c0 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 65  .    ** discarde
251d0 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 70 20  d.  WhereLoop p 
251e0 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a 20 20  is better if:.  
251f0 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20 68 61    **   (1)  p ha
25200 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64  s no more depend
25210 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54 65 6d  encies than pTem
25220 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a  plate, and.    *
25230 2a 20 20 20 28 32 29 20 20 70 20 68 61 73 20 61  *   (2)  p has a
25240 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72  n equal or lower
25250 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65 6d 70   cost than pTemp
25260 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  late.    */.    
25270 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26  if( (p->prereq &
25280 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
25290 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20  eq)==p->prereq  
252a0 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20    /* (1)  */.   
252b0 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d    && p->rSetup<=
252c0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
252d0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
252e0 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20     /* (2a) */.  
252f0 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70     && p->rRun<=p
25300 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20  Template->rRun  
25310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25320 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20      /* (2b) */. 
25330 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d      && p->nOut<=
25340 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20  pTemplate->nOut 
25350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25360 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a       /* (2c) */.
25370 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
25380 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63 61  urn 0;  /* Disca
25390 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  rd pTemplate */.
253a0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
253b0 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 6c   pTemplate is al
253c0 77 61 79 73 20 62 65 74 74 65 72 20 74 68 61 6e  ways better than
253d0 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65 20 70   p, then cause p
253e0 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74   to be overwritt
253f0 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 70  en.    ** with p
25400 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d 70  Template.  pTemp
25410 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 20 74  late is better t
25420 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a  han p if:.    **
25430 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c 61 74     (1)  pTemplat
25440 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65  e has no more de
25450 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e 20 70  pendences than p
25460 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28  , and.    **   (
25470 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61  2)  pTemplate ha
25480 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f  s an equal or lo
25490 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 2e  wer cost than p.
254a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
254b0 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65  (p->prereq & pTe
254c0 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d  mplate->prereq)=
254d0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72  =pTemplate->prer
254e0 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a  eq   /* (1)  */.
254f0 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e       && p->rRun>
25500 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e  =pTemplate->rRun
25510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25530 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20  (2a) */.     && 
25540 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61  p->nOut>=pTempla
25550 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20  te->nOut        
25560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25570 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a       /* (2b) */.
25580 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
25590 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d  ert( p->rSetup>=
255a0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
255b0 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e  p ); /* SETUP-IN
255c0 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f  VARIANT above */
255d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 20  .      break;   
255e0 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20 62 65  /* Cause p to be
255f0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20   overwritten by 
25600 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20  pTemplate */.   
25610 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
25620 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ppPrev;.}../*.**
25630 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61   Insert or repla
25640 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65  ce a WhereLoop e
25650 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 74  ntry using the t
25660 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64  emplate supplied
25670 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74  ..**.** An exist
25680 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  ing WhereLoop en
25690 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65  try might be ove
256a0 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20  rwritten if the 
256b0 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20  new template.** 
256c0 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68 61  is better and ha
256d0 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  s fewer dependen
256e0 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65  cies.  Or the te
256f0 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69  mplate will be i
25700 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f  gnored.** and no
25710 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63   insert will occ
25720 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ur if an existin
25730 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66  g WhereLoop is f
25740 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a  aster and has.**
25750 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
25760 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d  ies than the tem
25770 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73  plate.  Otherwis
25780 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
25790 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61  p is.** added ba
257a0 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c  sed on the templ
257b0 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42  ate..**.** If pB
257c0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
257d0 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
257e0 77 65 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e  we care about on
257f0 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71  ly the.** prereq
25800 75 69 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e  uisites and rRun
25810 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20   and nOut costs 
25820 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f  of the N best lo
25830 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e  ops.  That.** in
25840 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74  formation is gat
25850 68 65 72 65 64 20 69 6e 20 74 68 65 20 70 42 75  hered in the pBu
25860 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62  ilder->pOrSet ob
25870 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70 65 63  ject.  This spec
25880 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e  ial.** processin
25890 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f  g mode is used o
258a0 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73  nly for OR claus
258b0 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
258c0 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c  .** When accumul
258d0 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c  ating multiple l
258e0 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c  oops (when pBuil
258f0 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e  der->pOrSet is N
25900 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c  ULL) we.** still
25910 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65   might overwrite
25920 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77   similar loops w
25930 69 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70  ith the new temp
25940 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e  late if the.** n
25950 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62  ew template is b
25960 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61  etter.  Loops ma
25970 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  y be overwritten
25980 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
25990 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  g .** conditions
259a0 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
259b0 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76     (1)  They hav
259c0 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e  e the same iTab.
259d0 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79  .**    (2)  They
259e0 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69   have the same i
259f0 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28  SortIdx..**    (
25a00 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  3)  The template
25a10 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77   has same or few
25a20 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
25a30 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
25a40 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20   loop.**    (4) 
25a50 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
25a60 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
25a70 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68  wer cost than th
25a80 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
25a90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
25aa0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65  reLoopInsert(Whe
25ab0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
25ac0 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f  Builder, WhereLo
25ad0 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a  op *pTemplate){.
25ae0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
25af0 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72  Prev, *p;.  Wher
25b00 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
25b10 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
25b20 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
25b30 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
25b40 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ->db;..  /* If p
25b50 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
25b60 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  is defined, then
25b70 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b   only keep track
25b80 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20   of the costs.  
25b90 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a  ** and prereqs..
25ba0 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c    */.  if( pBuil
25bb0 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29  der->pOrSet!=0 )
25bc0 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  {.#if WHERETRACE
25bd0 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 75 31 36  _ENABLED.    u16
25be0 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70   n = pBuilder->p
25bf0 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e  OrSet->n;.    in
25c00 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20  t x =.#endif.   
25c10 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70   whereOrInsert(p
25c20 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c  Builder->pOrSet,
25c30 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
25c40 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72  eq, pTemplate->r
25c50 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Run,.           
25c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c70 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
25c80 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57  te->nOut);.#if W
25c90 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
25ca0 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
25cb0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
25cc0 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
25cd0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
25ce0 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72  gPrintf(x?"   or
25cf0 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58  -%d:  ":"   or-X
25d00 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20  :  ", n);.      
25d10 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
25d20 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
25d30 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a  er->pWC);.    }.
25d40 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
25d50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
25d60 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20  ..  /* Look for 
25d70 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  an existing Wher
25d80 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65  eLoop to replace
25d90 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a   with pTemplate.
25da0 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70    */.  whereLoop
25db0 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66  AdjustCost(pWInf
25dc0 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70  o->pLoops, pTemp
25dd0 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20  late);.  ppPrev 
25de0 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  = whereLoopFindL
25df0 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70  esser(&pWInfo->p
25e00 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65  Loops, pTemplate
25e10 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76  );..  if( ppPrev
25e20 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
25e30 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ere already exis
25e40 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ts a WhereLoop o
25e50 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20  n the list that 
25e60 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a  is better.    **
25e70 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c   than pTemplate,
25e80 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20   so just ignore 
25e90 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66  pTemplate */.#if
25ea0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
25eb0 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20  LED /* 0x8 */.  
25ec0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
25ed0 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
25ee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
25ef0 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 73 6b  bugPrintf("   sk
25f00 69 70 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68  ip: ");.      wh
25f10 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
25f20 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72  mplate, pBuilder
25f30 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65  ->pWC);.    }.#e
25f40 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
25f50 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d  SQLITE_OK;  .  }
25f60 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70  else{.    p = *p
25f70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pPrev;.  }..  /*
25f80 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
25f90 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73  s point it means
25fa0 20 74 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d   that either p[]
25fb0 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77   should be overw
25fc0 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68  ritten.  ** with
25fd0 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20   pTemplate[] if 
25fe0 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69  p[] exists, or i
25ff0 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61  f p==NULL then a
26000 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20  llocate a new.  
26010 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64  ** WhereLoop and
26020 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f   insert it..  */
26030 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
26040 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
26050 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  /.  if( sqlite3W
26060 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
26070 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20  ){.    if( p!=0 
26080 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
26090 44 65 62 75 67 50 72 69 6e 74 66 28 22 72 65 70  DebugPrintf("rep
260a0 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20 20 20 20  lace: ");.      
260b0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
260c0 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
260d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
260e0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
260f0 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20 20 20      add: ");.   
26100 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
26110 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c  pTemplate, pBuil
26120 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23  der->pWC);.  }.#
26130 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30  endif.  if( p==0
26140 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63   ){.    /* Alloc
26150 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c  ate a new WhereL
26160 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68  oop to add to th
26170 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73  e end of the lis
26180 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76  t */.    *ppPrev
26190 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62   = p = sqlite3Db
261a0 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
261b0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
261c0 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
261d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
261e0 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c  OMEM;.    whereL
261f0 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20  oopInit(p);.    
26200 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30  p->pNextLoop = 0
26210 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
26220 2a 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65  * We will be ove
26230 72 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f  rwriting WhereLo
26240 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66  op p[].  But bef
26250 6f 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74  ore we do, first
26260 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75  .    ** go throu
26270 67 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  gh the rest of t
26280 68 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65  he list and dele
26290 74 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74  te any other ent
262a0 72 69 65 73 20 62 65 73 69 64 65 73 0a 20 20 20  ries besides.   
262b0 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65   ** p[] that are
262c0 20 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20   also supplated 
262d0 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  by pTemplate */.
262e0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a      WhereLoop **
262f0 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65  ppTail = &p->pNe
26300 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72  xtLoop;.    Wher
26310 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20  eLoop *pToDel;. 
26320 20 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69     while( *ppTai
26330 6c 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69  l ){.      ppTai
26340 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e  l = whereLoopFin
26350 64 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20  dLesser(ppTail, 
26360 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20  pTemplate);.    
26370 20 20 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20    if( ppTail==0 
26380 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
26390 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b  ToDel = *ppTail;
263a0 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 44 65  .      if( pToDe
263b0 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==0 ) break;.  
263c0 20 20 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54      *ppTail = pT
263d0 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b  oDel->pNextLoop;
263e0 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
263f0 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
26400 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
26410 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
26420 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73  0x8 ){.        s
26430 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
26440 66 28 22 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a  f(" delete: ");.
26450 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
26460 70 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70  pPrint(pToDel, p
26470 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
26480 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
26490 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c      whereLoopDel
264a0 65 74 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b  ete(db, pToDel);
264b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 65  .    }.  }.  whe
264c0 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70  reLoopXfer(db, p
264d0 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20  , pTemplate);.  
264e0 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
264f0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
26500 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
26510 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
26520 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
26530 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  x;.    if( pInde
26540 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75  x && pIndex->tnu
26550 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  m==0 ){.      p-
26560 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
26570 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
26580 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26590 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  K;.}../*.** Adju
265a0 73 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  st the WhereLoop
265b0 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e  .nOut value down
265c0 77 61 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20  ward to account 
265d0 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
265e0 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
265f0 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
26600 74 68 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69  the loop but whi
26610 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ch are not used 
26620 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a  by an.** index..
26630 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 75 72  **.** In the cur
26640 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
26650 69 6f 6e 2c 20 74 68 65 20 66 69 72 73 74 20 65  ion, the first e
26660 78 74 72 61 20 57 48 45 52 45 20 63 6c 61 75 73  xtra WHERE claus
26670 65 20 74 65 72 6d 20 72 65 64 75 63 65 73 0a 2a  e term reduces.*
26680 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
26690 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79 20 61  output rows by a
266a0 20 66 61 63 74 6f 72 20 6f 66 20 31 30 20 61 6e   factor of 10 an
266b0 64 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61  d each additiona
266c0 6c 20 74 65 72 6d 0a 2a 2a 20 72 65 64 75 63 65  l term.** reduce
266d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
266e0 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79 20 73  output rows by s
266f0 71 72 74 28 32 29 2e 0a 2a 2f 0a 73 74 61 74 69  qrt(2)..*/.stati
26700 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
26710 4f 75 74 70 75 74 41 64 6a 75 73 74 28 0a 20 20  OutputAdjust(.  
26720 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
26730 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  ,      /* The WH
26740 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
26750 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
26760 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f  ,      /* The lo
26770 6f 70 20 74 6f 20 61 64 6a 75 73 74 20 64 6f 77  op to adjust dow
26780 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73  nward */.  LogEs
26790 74 20 6e 52 6f 77 20 20 20 20 20 20 20 20 20 20  t nRow          
267a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
267b0 6f 77 73 20 69 6e 20 74 68 65 20 65 6e 74 69 72  ows in the entir
267c0 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
267d0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
267e0 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b  , *pX;.  Bitmask
267f0 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28   notAllowed = ~(
26800 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c  pLoop->prereq|pL
26810 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a  oop->maskSelf);.
26820 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
26830 74 20 6e 45 71 20 3d 20 30 3b 20 20 20 20 2f 2a  t nEq = 0;    /*
26840 20 4e 75 6d 62 65 72 20 6f 66 20 3d 20 63 6f 6e   Number of = con
26850 73 74 72 61 69 6e 74 73 20 6e 6f 74 20 77 69 74  straints not wit
26860 68 69 6e 20 6c 69 6b 65 6c 79 28 29 2f 75 6e 6c  hin likely()/unl
26870 69 6b 65 6c 79 28 29 20 2a 2f 0a 0a 20 20 66 6f  ikely() */..  fo
26880 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20  r(i=pWC->nTerm, 
26890 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e  pTerm=pWC->a; i>
268a0 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; i--, pTerm++)
268b0 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
268c0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
268d0 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62  _VIRTUAL)!=0 ) b
268e0 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70  reak;.    if( (p
268f0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
26900 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
26910 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  f)==0 ) continue
26920 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
26930 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
26940 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63  tAllowed)!=0 ) c
26950 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
26960 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d  (j=pLoop->nLTerm
26970 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
26980 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70        pX = pLoop
26990 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
269a0 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63     if( pX==0 ) c
269b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
269c0 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62  f( pX==pTerm ) b
269d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
269e0 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26  pX->iParent>=0 &
269f0 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69  & (&pWC->a[pX->i
26a00 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20  Parent])==pTerm 
26a10 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
26a20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20     if( j<0 ){.  
26a30 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
26a40 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20  ruthProb<=0 ){. 
26a50 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
26a60 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  ut += pTerm->tru
26a70 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 7d 65  thProb;.      }e
26a80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  lse{.        pLo
26a90 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20  op->nOut--;.    
26aa0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
26ab0 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 20 29  Operator&WO_EQ )
26ac0 20 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a   nEq++;.      }.
26ad0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 54      }.  }.  /* T
26ae0 55 4e 49 4e 47 3a 20 20 49 66 20 74 68 65 72 65  UNING:  If there
26af0 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   is at least one
26b00 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
26b10 61 69 6e 74 20 69 6e 20 74 68 65 20 57 48 45 52  aint in the WHER
26b20 45 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 74 68  E.  ** clause th
26b30 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  at does not have
26b40 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20   a likelihood() 
26b50 65 78 70 6c 69 63 69 74 6c 79 20 61 73 73 69 67  explicitly assig
26b60 6e 65 64 20 74 6f 20 69 74 0a 20 20 2a 2a 20 74  ned to it.  ** t
26b70 68 65 6e 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74  hen do not let t
26b80 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
26b90 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
26ba0 77 73 20 65 78 63 65 65 64 20 68 61 6c 66 20 0a  ws exceed half .
26bb0 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
26bc0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
26bd0 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  able. */.  if( n
26be0 45 71 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  Eq && pLoop->nOu
26bf0 74 3e 6e 52 6f 77 2d 31 30 20 29 7b 0a 20 20 20  t>nRow-10 ){.   
26c00 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e   pLoop->nOut = n
26c10 52 6f 77 20 2d 20 31 30 3b 0a 20 20 7d 0a 7d 0a  Row - 10;.  }.}.
26c20 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
26c30 65 20 63 6f 73 74 20 43 20 62 79 20 74 68 65 20  e cost C by the 
26c40 63 6f 73 74 4d 75 6c 74 20 66 61 63 74 65 72 20  costMult facter 
26c50 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63  T.  This only oc
26c60 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  curs if.** compi
26c70 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c 49 54  led with -DSQLIT
26c80 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c  E_ENABLE_COSTMUL
26c90 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  T.*/.#ifdef SQLI
26ca0 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55  TE_ENABLE_COSTMU
26cb0 4c 54 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c  LT.# define Appl
26cc0 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
26cd0 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c  C,T)  C += T.#el
26ce0 73 65 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c  se.# define Appl
26cf0 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
26d00 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  C,T).#endif../*.
26d10 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66 61  ** We have so fa
26d20 72 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64  r matched pBuild
26d30 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
26d40 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74  e.nEq terms of t
26d50 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e  he .** index pIn
26d60 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74 63  dex. Try to matc
26d70 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a  h one more..**.*
26d80 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
26d90 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
26da0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
26db0 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  nOut contains th
26dc0 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  e .** number of 
26dd0 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f  rows expected to
26de0 20 62 65 20 76 69 73 69 74 65 64 20 62 79 20 66   be visited by f
26df0 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20 74  iltering using t
26e00 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73  he nEq .** terms
26e10 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73 20   only. If it is 
26e20 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20 76  modified, this v
26e30 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65 64  alue is restored
26e40 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a   before this .**
26e50 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
26e60 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f  s..**.** If pPro
26e70 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61  be->tnum==0, tha
26e80 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69  t means pIndex i
26e90 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75  s a fake index u
26ea0 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49  sed for the.** I
26eb0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
26ec0 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EY..*/.static in
26ed0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
26ee0 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  reeIndex(.  Wher
26ef0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
26f00 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54  uilder,     /* T
26f10 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63  he WhereLoop fac
26f20 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  tory */.  struct
26f30 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
26f40 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  Src,      /* FRO
26f50 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
26f60 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
26f70 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c    Index *pProbe,
26f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f90 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
26fa0 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73   pSrc */.  LogEs
26fb0 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20  t nInMul        
26fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
26fd0 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  g(Number of iter
26fe0 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e  ations due to IN
26ff0 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  ) */.){.  WhereI
27000 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
27010 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20  uilder->pWInfo; 
27020 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
27030 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  e context */.  P
27040 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
27050 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
27060 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
27070 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
27080 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
27090 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a  se->db;       /*
270a0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
270b0 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74  tion malloc cont
270c0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
270d0 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
270e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
270f0 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75  late WhereLoop u
27100 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
27110 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
27120 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
27130 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72         /* A Wher
27140 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73  eTerm under cons
27150 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  ideration */.  i
27160 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20  nt opMask;      
27170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27180 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72  * Valid operator
27190 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  s for constraint
271a0 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e  s */.  WhereScan
271b0 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20   scan;          
271c0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
271d0 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72  or for WHERE ter
271e0 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
271f0 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20  saved_prereq;   
27200 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
27210 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
27220 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75  w->prereq */.  u
27230 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b  16 saved_nLTerm;
27240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27250 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
27260 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d   of pNew->nLTerm
27270 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
27280 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
27290 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
272a0 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
272b0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a  >u.btree.nEq */.
272c0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69    u16 saved_nSki
272d0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
272e0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
272f0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b  lue of pNew->nSk
27300 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65  ip */.  u32 save
27310 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20  d_wsFlags;      
27320 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
27330 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
27340 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20  w->wsFlags */.  
27350 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75  LogEst saved_nOu
27360 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
27370 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
27380 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
27390 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
273a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273b0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
273c0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74   the column in t
273d0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
273e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
273f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
27400 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
27410 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20    LogEst rSize; 
27420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27430 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
27440 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
27450 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f   */.  LogEst rLo
27460 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
27470 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74        /* Logarit
27480 68 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65  hm of table size
27490 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
274a0 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d  *pTop = 0, *pBtm
274b0 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64   = 0; /* Top and
274c0 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f   bottom range co
274d0 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20  nstraints */..  
274e0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
274f0 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d  >pNew;.  if( db-
27500 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
27510 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
27520 4d 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  MEM;..  assert( 
27530 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
27540 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
27550 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  BLE)==0 );.  ass
27560 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c  ert( (pNew->wsFl
27570 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
27580 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69  LIMIT)==0 );.  i
27590 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  f( pNew->wsFlags
275a0 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
275b0 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b  IT ){.    opMask
275c0 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a   = WO_LT|WO_LE;.
275d0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f    }else if( pPro
275e0 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28  be->tnum<=0 || (
275f0 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  pSrc->jointype &
27600 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a   JT_LEFT)!=0 ){.
27610 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
27620 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57  EQ|WO_IN|WO_GT|W
27630 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
27640 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
27650 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  pMask = WO_EQ|WO
27660 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  _IN|WO_ISNULL|WO
27670 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
27680 57 4f 5f 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28  WO_LE;.  }.  if(
27690 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65   pProbe->bUnorde
276a0 72 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20  red ) opMask &= 
276b0 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  ~(WO_GT|WO_GE|WO
276c0 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61  _LT|WO_LE);..  a
276d0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62  ssert( pNew->u.b
276e0 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d  tree.nEq<pProbe-
276f0 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 43  >nColumn );.  iC
27700 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43  ol = pProbe->aiC
27710 6f 6c 75 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74  olumn[pNew->u.bt
27720 72 65 65 2e 6e 45 71 5d 3b 0a 0a 20 20 70 54 65  ree.nEq];..  pTe
27730 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e  rm = whereScanIn
27740 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64  it(&scan, pBuild
27750 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69  er->pWC, pSrc->i
27760 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20  Cursor, iCol,.  
27770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27780 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50        opMask, pP
27790 72 6f 62 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e  robe);.  saved_n
277a0 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72  Eq = pNew->u.btr
277b0 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f  ee.nEq;.  saved_
277c0 6e 53 6b 69 70 20 3d 20 70 4e 65 77 2d 3e 6e 53  nSkip = pNew->nS
277d0 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54  kip;.  saved_nLT
277e0 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65  erm = pNew->nLTe
277f0 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73 46 6c  rm;.  saved_wsFl
27800 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c  ags = pNew->wsFl
27810 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70 72 65  ags;.  saved_pre
27820 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72  req = pNew->prer
27830 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74  eq;.  saved_nOut
27840 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20   = pNew->nOut;. 
27850 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
27860 30 3b 0a 20 20 72 53 69 7a 65 20 3d 20 70 50 72  0;.  rSize = pPr
27870 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
27880 5b 30 5d 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20  [0];.  rLogSize 
27890 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b  = estLog(rSize);
278a0 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c  .  for(; rc==SQL
278b0 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21  ITE_OK && pTerm!
278c0 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72  =0; pTerm = wher
278d0 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
278e0 29 7b 0a 20 20 20 20 75 31 36 20 65 4f 70 20 3d  ){.    u16 eOp =
278f0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
27900 72 3b 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e  r;   /* Shorthan
27910 64 20 66 6f 72 20 70 54 65 72 6d 2d 3e 65 4f 70  d for pTerm->eOp
27920 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f  erator */.    Lo
27930 67 45 73 74 20 72 43 6f 73 74 49 64 78 3b 0a 20  gEst rCostIdx;. 
27940 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 55 6e     LogEst nOutUn
27950 61 64 6a 75 73 74 65 64 3b 20 20 20 20 20 20 20  adjusted;       
27960 20 2f 2a 20 6e 4f 75 74 20 62 65 66 6f 72 65 20   /* nOut before 
27970 49 4e 28 29 20 61 6e 64 20 57 48 45 52 45 20 61  IN() and WHERE a
27980 64 6a 75 73 74 6d 65 6e 74 73 20 2a 2f 0a 20 20  djustments */.  
27990 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23    int nIn = 0;.#
279a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
279b0 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
279c0 54 34 0a 20 20 20 20 69 6e 74 20 6e 52 65 63 56  T4.    int nRecV
279d0 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d  alid = pBuilder-
279e0 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64  >nRecValid;.#end
279f0 69 66 0a 20 20 20 20 69 66 28 20 28 65 4f 70 3d  if.    if( (eOp=
27a00 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70  =WO_ISNULL || (p
27a10 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45  Term->wtFlags&TE
27a20 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20  RM_VNULL)!=0).  
27a30 20 20 20 26 26 20 28 69 43 6f 6c 3c 30 20 7c 7c     && (iCol<0 ||
27a40 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f   pSrc->pTab->aCo
27a50 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 29  l[iCol].notNull)
27a60 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f  .    ){.      co
27a70 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72  ntinue; /* ignor
27a80 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20  e IS [NOT] NULL 
27a90 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e  constraints on N
27aa0 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
27ab0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  */.    }.    if(
27ac0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
27ad0 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
27ae0 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
27af0 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ..    pNew->wsFl
27b00 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
27b10 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ags;.    pNew->u
27b20 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
27b30 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77  ed_nEq;.    pNew
27b40 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
27b50 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28  _nLTerm;.    if(
27b60 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
27b70 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
27b80 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65  >nLTerm+1) ) bre
27b90 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20  ak; /* OOM */.  
27ba0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70    pNew->aLTerm[p
27bb0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d  New->nLTerm++] =
27bc0 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77   pTerm;.    pNew
27bd0 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76 65  ->prereq = (save
27be0 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d  d_prereq | pTerm
27bf0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20 26  ->prereqRight) &
27c00 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66   ~pNew->maskSelf
27c10 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ;..    assert( n
27c20 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20  InMul==0.       
27c30 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   || (pNew->wsFla
27c40 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
27c50 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20  N_NULL)!=0 .    
27c60 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73      || (pNew->ws
27c70 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
27c80 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20  LUMN_IN)!=0 .   
27c90 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
27ca0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  sFlags & WHERE_S
27cb0 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20 20  KIPSCAN)!=0 .   
27cc0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f 70   );..    if( eOp
27cd0 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
27ce0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
27cf0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
27d00 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
27d10 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
27d20 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20  N_IN;.      if( 
27d30 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
27d40 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
27d50 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
27d60 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  /* "x IN (SELECT
27d70 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a   ...)":  TUNING:
27d80 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75   the SELECT retu
27d90 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20  rns 25 rows */. 
27da0 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b         nIn = 46;
27db0 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71    assert( 46==sq
27dc0 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20  lite3LogEst(25) 
27dd0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
27de0 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
27df0 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70  >x.pList && pExp
27e00 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
27e10 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
27e20 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76   "x IN (value, v
27e30 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20  alue, ...)" */. 
27e40 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c         nIn = sql
27e50 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72  ite3LogEst(pExpr
27e60 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
27e70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
27e80 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30 20 29   assert( nIn>0 )
27e90 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61 79 73  ;  /* RHS always
27ea0 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65 20 74   has 2 or more t
27eb0 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61 72  erms...  The par
27ec0 73 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  ser.            
27ed0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63              ** c
27ee0 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f 29  hanges "x IN (?)
27ef0 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f  " into "x=?". */
27f00 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ..    }else if( 
27f10 65 4f 70 20 26 20 28 57 4f 5f 45 51 29 20 29 7b  eOp & (WO_EQ) ){
27f20 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
27f30 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
27f40 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69  LUMN_EQ;.      i
27f50 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 28 6e 49  f( iCol<0 || (nI
27f60 6e 4d 75 6c 3d 3d 30 20 26 26 20 70 4e 65 77 2d  nMul==0 && pNew-
27f70 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 70 50  >u.btree.nEq==pP
27f80 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29  robe->nKeyCol-1)
27f90 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
27fa0 69 43 6f 6c 3e 3d 30 20 26 26 20 21 49 73 55 6e  iCol>=0 && !IsUn
27fb0 69 71 75 65 49 6e 64 65 78 28 70 50 72 6f 62 65  iqueIndex(pProbe
27fc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
27fd0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
27fe0 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44  WHERE_UNQ_WANTED
27ff0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
28000 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
28010 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
28020 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20  E_ONEROW;.      
28030 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
28040 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20  }else if( eOp & 
28050 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
28060 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
28070 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
28080 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
28090 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 47   if( eOp & (WO_G
280a0 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20  T|WO_GE) ){.    
280b0 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
280c0 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20  & WO_GT );.     
280d0 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
280e0 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20   WO_GE );.      
280f0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
28100 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
28110 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49  NGE|WHERE_BTM_LI
28120 4d 49 54 3b 0a 20 20 20 20 20 20 70 42 74 6d 20  MIT;.      pBtm 
28130 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
28140 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Top = 0;.    }el
28150 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
28160 28 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57  ( eOp & (WO_LT|W
28170 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74  O_LE) );.      t
28180 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
28190 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  O_LT );.      te
281a0 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
281b0 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  _LE );.      pNe
281c0 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
281d0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
281e0 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
281f0 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70  ;.      pTop = p
28200 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d  Term;.      pBtm
28210 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67   = (pNew->wsFlag
28220 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
28230 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20  MIT)!=0 ?.      
28240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
28250 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
28260 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b  ->nLTerm-2] : 0;
28270 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
28280 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 4e 65  t this point pNe
28290 77 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74 20 74  w->nOut is set t
282a0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
282b0 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f  rows expected to
282c0 0a 20 20 20 20 2a 2a 20 62 65 20 76 69 73 69 74  .    ** be visit
282d0 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 20  ed by the index 
282e0 73 63 61 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73  scan before cons
282f0 69 64 65 72 69 6e 67 20 74 65 72 6d 20 70 54 65  idering term pTe
28300 72 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  rm, or the.    *
28310 2a 20 76 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20  * values of nIn 
28320 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f  and nInMul. In o
28330 74 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75  ther words, assu
28340 6d 69 6e 67 20 74 68 61 74 20 61 6c 6c 20 0a 20  ming that all . 
28350 20 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29     ** "x IN(...)
28360 22 20 74 65 72 6d 73 20 61 72 65 20 72 65 70 6c  " terms are repl
28370 61 63 65 64 20 77 69 74 68 20 22 78 20 3d 20 3f  aced with "x = ?
28380 22 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 75 70  ". This block up
28390 64 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  dates.    ** the
283a0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
283b0 6e 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e 74 20  nOut to account 
283c0 66 6f 72 20 70 54 65 72 6d 20 28 62 75 74 20 6e  for pTerm (but n
283d0 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20  ot nIn/nInMul). 
283e0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
283f0 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65  pNew->nOut==save
28400 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 69 66  d_nOut );.    if
28410 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
28420 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  & WHERE_COLUMN_R
28430 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ANGE ){.      /*
28440 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 75 73 69   Adjust nOut usi
28450 6e 67 20 73 74 61 74 33 2f 73 74 61 74 34 20 64  ng stat3/stat4 d
28460 61 74 61 2e 20 4f 72 2c 20 69 66 20 74 68 65 72  ata. Or, if ther
28470 65 20 69 73 20 6e 6f 20 73 74 61 74 33 2f 73 74  e is no stat3/st
28480 61 74 34 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  at4.      ** dat
28490 61 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74  a, using some ot
284a0 68 65 72 20 65 73 74 69 6d 61 74 65 2e 20 20 2a  her estimate.  *
284b0 2f 0a 20 20 20 20 20 20 77 68 65 72 65 52 61 6e  /.      whereRan
284c0 67 65 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  geScanEst(pParse
284d0 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 42 74 6d  , pBuilder, pBtm
284e0 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20  , pTop, pNew);. 
284f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28500 69 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77  int nEq = ++pNew
28510 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
28520 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70       assert( eOp
28530 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f   & (WO_ISNULL|WO
28540 5f 45 51 7c 57 4f 5f 49 4e 29 20 29 3b 0a 0a 20  _EQ|WO_IN) );.. 
28550 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
28560 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e  w->nOut==saved_n
28570 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Out );.      if(
28580 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
28590 62 3c 3d 30 20 26 26 20 69 43 6f 6c 3e 3d 30 20  b<=0 && iCol>=0 
285a0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
285b0 74 28 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29  t( (eOp & WO_IN)
285c0 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20   || nIn==0 );.  
285d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
285e0 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  eOp & WO_IN );. 
285f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
28600 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74  t += pTerm->trut
28610 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 70  hProb;.        p
28620 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e  New->nOut -= nIn
28630 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23  ;.      }else{.#
28640 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
28650 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
28660 54 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63  T4.        tRowc
28670 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20  nt nOut = 0;.   
28680 20 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d       if( nInMul=
28690 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
286a0 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20  pProbe->nSample 
286b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65  .         && pNe
286c0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d  w->u.btree.nEq<=
286d0 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43  pProbe->nSampleC
286e0 6f 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  ol.         && O
286f0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
28700 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 74  ed(db, SQLITE_St
28710 61 74 33 29 20 0a 20 20 20 20 20 20 20 20 20 26  at3) .         &
28720 26 20 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29  & ((eOp & WO_IN)
28730 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48 61 73 50  ==0 || !ExprHasP
28740 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
28750 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
28760 63 74 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ct)).        ){.
28770 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
28780 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
28790 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
287a0 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f 45  if( (eOp & (WO_E
287b0 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30  Q|WO_ISNULL))!=0
287c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
287d0 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
287e0 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
287f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
28800 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
28810 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
28820 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61   = whereEqualSca
28830 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
28840 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 70 52  ilder, pExpr->pR
28850 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20  ight, &nOut);.  
28860 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28870 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
28880 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70  whereInScanEst(p
28890 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
288a0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
288b0 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20   &nOut);.       
288c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
288d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
288e0 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51  TFOUND ) rc = SQ
288f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
28900 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28910 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20 20 20  E_OK ) break;   
28920 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f         /* Jump o
28930 75 74 20 6f 66 20 74 68 65 20 70 54 65 72 6d 20  ut of the pTerm 
28940 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 20 20  loop */.        
28950 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20    if( nOut ){.  
28960 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
28970 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nOut = sqlite3Lo
28980 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20  gEst(nOut);.    
28990 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
289a0 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75  ->nOut>saved_nOu
289b0 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  t ) pNew->nOut =
289c0 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
289d0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
289e0 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20  Out -= nIn;.    
289f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28a00 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f  }.        if( nO
28a10 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66 0a 20  ut==0 ).#endif. 
28a20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
28a30 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
28a40 20 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c   (pProbe->aiRowL
28a50 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70 50 72  ogEst[nEq] - pPr
28a60 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
28a70 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20 20 20  [nEq-1]);.      
28a80 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f      if( eOp & WO
28a90 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
28aa0 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
28ab0 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  : If there is no
28ac0 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61   likelihood() va
28ad0 6c 75 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74  lue, assume that
28ae0 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   a .            
28af0 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c 4c 22  ** "col IS NULL"
28b00 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63   expression matc
28b10 68 65 73 20 74 77 69 63 65 20 61 73 20 6d 61 6e  hes twice as man
28b20 79 20 72 6f 77 73 20 0a 20 20 20 20 20 20 20 20  y rows .        
28b30 20 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f      ** as (col=?
28b40 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ). */.          
28b50 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
28b60 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  10;.          }.
28b70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28b80 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
28b90 53 65 74 20 72 43 6f 73 74 49 64 78 20 74 6f 20  Set rCostIdx to 
28ba0 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  the cost of visi
28bb0 74 69 6e 67 20 73 65 6c 65 63 74 65 64 20 72 6f  ting selected ro
28bc0 77 73 20 69 6e 20 69 6e 64 65 78 2e 20 41 64 64  ws in index. Add
28bd0 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 70 4e  .    ** it to pN
28be0 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63 68 20  ew->rRun, which 
28bf0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74  is currently set
28c00 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20   to the cost of 
28c10 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  the index.    **
28c20 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e   seek only. Then
28c30 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 6e  , if this is a n
28c40 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
28c50 78 2c 20 61 64 64 20 74 68 65 20 63 6f 73 74 20  x, add the cost 
28c60 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73 69 74 69  of.    ** visiti
28c70 6e 67 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74  ng the rows in t
28c80 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20  he main table.  
28c90 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49 64 78 20  */.    rCostIdx 
28ca0 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31  = pNew->nOut + 1
28cb0 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73   + (15*pProbe->s
28cc0 7a 49 64 78 52 6f 77 29 2f 70 53 72 63 2d 3e 70  zIdxRow)/pSrc->p
28cd0 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
28ce0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
28cf0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
28d00 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f 73 74  (rLogSize, rCost
28d10 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 28 70  Idx);.    if( (p
28d20 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
28d30 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
28d40 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b  HERE_IPK))==0 ){
28d50 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
28d60 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
28d70 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
28d80 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 36   pNew->nOut + 16
28d90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 70 70  );.    }.    App
28da0 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
28db0 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 50 72  (pNew->rRun, pPr
28dc0 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73  obe->pTable->cos
28dd0 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20 6e 4f 75  tMult);..    nOu
28de0 74 55 6e 61 64 6a 75 73 74 65 64 20 3d 20 70 4e  tUnadjusted = pN
28df0 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 70 4e  ew->nOut;.    pN
28e00 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d  ew->rRun += nInM
28e10 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 70 4e  ul + nIn;.    pN
28e20 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d  ew->nOut += nInM
28e30 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 77 68  ul + nIn;.    wh
28e40 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
28e50 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 57  ust(pBuilder->pW
28e60 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
28e70 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
28e80 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
28e90 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20  er, pNew);..    
28ea0 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
28eb0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
28ec0 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
28ed0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
28ee0 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65 6c  ed_nOut;.    }el
28ef0 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
28f00 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64 6a  nOut = nOutUnadj
28f10 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  usted;.    }..  
28f20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
28f30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
28f40 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20  _LIMIT)==0.     
28f50 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
28f60 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f  .nEq<pProbe->nCo
28f70 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20  lumn.    ){.    
28f80 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74    whereLoopAddBt
28f90 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
28fa0 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
28fb0 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20   nInMul+nIn);.  
28fc0 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f    }.    pNew->nO
28fd0 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
28fe0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
28ff0 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
29000 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64 65  TAT4.    pBuilde
29010 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
29020 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66  RecValid;.#endif
29030 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65  .  }.  pNew->pre
29040 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65 72  req = saved_prer
29050 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  eq;.  pNew->u.bt
29060 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
29070 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b  nEq;.  pNew->nSk
29080 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70  ip = saved_nSkip
29090 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  ;.  pNew->wsFlag
290a0 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67  s = saved_wsFlag
290b0 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  s;.  pNew->nOut 
290c0 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20  = saved_nOut;.  
290d0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73  pNew->nLTerm = s
290e0 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20  aved_nLTerm;..  
290f0 2f 2a 20 43 6f 6e 73 69 64 65 72 20 75 73 69 6e  /* Consider usin
29100 67 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69 66  g a skip-scan if
29110 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48   there are no WH
29120 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
29130 72 61 69 6e 74 73 0a 20 20 2a 2a 20 61 76 61 69  raints.  ** avai
29140 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6c 65  lable for the le
29150 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 6f 66  ft-most terms of
29160 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20   the index, and 
29170 69 66 20 74 68 65 20 61 76 65 72 61 67 65 0a 20  if the average. 
29180 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 65   ** number of re
29190 70 65 61 74 73 20 69 6e 20 74 68 65 20 6c 65 66  peats in the lef
291a0 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 69 73 20  t-most terms is 
291b0 61 74 20 6c 65 61 73 74 20 31 38 2e 20 0a 20 20  at least 18. .  
291c0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 61 67 69  **.  ** The magi
291d0 63 20 6e 75 6d 62 65 72 20 31 38 20 69 73 20 73  c number 18 is s
291e0 65 6c 65 63 74 65 64 20 6f 6e 20 74 68 65 20 62  elected on the b
291f0 61 73 69 73 20 74 68 61 74 20 73 63 61 6e 6e 69  asis that scanni
29200 6e 67 20 31 37 20 72 6f 77 73 0a 20 20 2a 2a 20  ng 17 rows.  ** 
29210 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
29220 20 71 75 69 63 6b 65 72 20 74 68 61 6e 20 61 6e   quicker than an
29230 20 69 6e 64 65 78 20 73 65 65 6b 20 28 65 76 65   index seek (eve
29240 6e 20 74 68 6f 75 67 68 20 69 66 20 74 68 65 20  n though if the 
29250 69 6e 64 65 78 0a 20 20 2a 2a 20 63 6f 6e 74 61  index.  ** conta
29260 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20 32  ins fewer than 2
29270 5e 31 37 20 72 6f 77 73 20 77 65 20 61 73 73 75  ^17 rows we assu
29280 6d 65 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20  me otherwise in 
29290 6f 74 68 65 72 20 70 61 72 74 73 20 6f 66 0a 20  other parts of. 
292a0 20 2a 2a 20 74 68 65 20 63 6f 64 65 29 2e 20 41   ** the code). A
292b0 6e 64 2c 20 65 76 65 6e 20 69 66 20 69 74 20 69  nd, even if it i
292c0 73 20 6e 6f 74 2c 20 69 74 20 73 68 6f 75 6c 64  s not, it should
292d0 20 6e 6f 74 20 62 65 20 74 6f 6f 20 6d 75 63 68   not be too much
292e0 20 73 6c 6f 77 65 72 2e 20 0a 20 20 2a 2a 20 4f   slower. .  ** O
292f0 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
29300 2c 20 74 68 65 20 65 78 74 72 61 20 73 65 65 6b  , the extra seek
29310 73 20 63 6f 75 6c 64 20 65 6e 64 20 75 70 20 62  s could end up b
29320 65 69 6e 67 20 73 69 67 6e 69 66 69 63 61 6e 74  eing significant
29330 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65 20 65 78 70  ly.  ** more exp
29340 65 6e 73 69 76 65 2e 20 20 2a 2f 0a 20 20 61 73  ensive.  */.  as
29350 73 65 72 74 28 20 34 32 3d 3d 73 71 6c 69 74 65  sert( 42==sqlite
29360 33 4c 6f 67 45 73 74 28 31 38 29 20 29 3b 0a 20  3LogEst(18) );. 
29370 20 69 66 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d   if( saved_nEq==
29380 73 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20 20 26  saved_nSkip.   &
29390 26 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c 70 50  & saved_nEq+1<pP
293a0 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20  robe->nKeyCol.  
293b0 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f   && pProbe->aiRo
293c0 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45  wLogEst[saved_nE
293d0 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54 55 4e  q+1]>=42  /* TUN
293e0 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72  ING: Minimum for
293f0 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20   skip-scan */.  
29400 20 26 26 20 28 72 63 20 3d 20 77 68 65 72 65 4c   && (rc = whereL
29410 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
29420 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ew, pNew->nLTerm
29430 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  +1))==SQLITE_OK.
29440 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20    ){.    LogEst 
29450 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d  nIter;.    pNew-
29460 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a  >u.btree.nEq++;.
29470 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b      pNew->nSkip+
29480 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  +;.    pNew->aLT
29490 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
294a0 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  ++] = 0;.    pNe
294b0 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
294c0 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20  ERE_SKIPSCAN;.  
294d0 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f 62 65    nIter = pProbe
294e0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61  ->aiRowLogEst[sa
294f0 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62  ved_nEq] - pProb
29500 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
29510 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20  aved_nEq+1];.   
29520 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e   pNew->nOut -= n
29530 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54 55 4e  Iter;.    /* TUN
29540 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20 75 6e  ING:  Because un
29550 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e 20 74  certainties in t
29560 68 65 20 65 73 74 69 6d 61 74 65 73 20 66 6f 72  he estimates for
29570 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65 72 69   skip-scan queri
29580 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64 20 61  es,.    ** add a
29590 20 31 2e 33 37 35 20 66 75 64 67 65 20 66 61 63   1.375 fudge fac
295a0 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b 69 70  tor to make skip
295b0 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79 20 6c  -scan slightly l
295c0 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20  ess likely. */. 
295d0 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b 0a 20     nIter += 5;. 
295e0 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42     whereLoopAddB
295f0 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
29600 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
29610 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c  , nIter + nInMul
29620 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  );.    pNew->nOu
29630 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
29640 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
29650 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45  e.nEq = saved_nE
29660 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b  q;.    pNew->nSk
29670 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70  ip = saved_nSkip
29680 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ;.    pNew->wsFl
29690 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
296a0 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ags;.  }..  retu
296b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
296c0 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69  Return True if i
296d0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
296e0 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20  at pIndex might 
296f0 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20  be useful in.** 
29700 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
29710 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
29720 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a   in pBuilder..**
29730 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65  .** Return False
29740 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65   if pBuilder doe
29750 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
29760 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
29770 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20   or.** if there 
29780 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49  is no way for pI
29790 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75  ndex to be usefu
297a0 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  l in implementin
297b0 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20  g that.** ORDER 
297c0 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  BY clause..*/.st
297d0 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69  atic int indexMi
297e0 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
297f0 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  By(.  WhereLoopB
29800 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
29810 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ,.  Index *pInde
29820 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72  x,.  int iCursor
29830 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
29840 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a  pOB;.  int ii, j
29850 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  j;..  if( pIndex
29860 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72  ->bUnordered ) r
29870 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
29880 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pOB = pBuilder->
29890 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
298a0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
298b0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
298c0 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  pOB->nExpr; ii++
298d0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
298e0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
298f0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d  SkipCollate(pOB-
29900 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20  >a[ii].pExpr);. 
29910 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
29920 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
29930 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
29940 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
29950 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
29960 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
29970 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
29980 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b  .      for(jj=0;
29990 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79   jj<pIndex->nKey
299a0 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  Col; jj++){.    
299b0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
299c0 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e  Column==pIndex->
299d0 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72  aiColumn[jj] ) r
299e0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
299f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
29a00 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
29a10 52 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b  Return a bitmask
29a20 20 77 68 65 72 65 20 31 73 20 69 6e 64 69 63 61   where 1s indica
29a30 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  te that the corr
29a40 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
29a50 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
29a60 20 69 73 20 75 73 65 64 20 62 79 20 61 6e 20 69   is used by an i
29a70 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20  ndex.  Only the 
29a80 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
29a90 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e   are considered.
29aa0 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
29ab0 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  sk columnsInInde
29ac0 78 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  x(Index *pIdx){.
29ad0 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b    Bitmask m = 0;
29ae0 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28  .  int j;.  for(
29af0 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  j=pIdx->nColumn-
29b00 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
29b10 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d     int x = pIdx-
29b20 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
29b30 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
29b40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
29b50 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
29b60 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
29b70 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -2 );.      if( 
29b80 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d  x<BMS-1 ) m |= M
29b90 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d  ASKBIT(x);.    }
29ba0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
29bb0 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20  .}../* Check to 
29bc0 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c  see if a partial
29bd0 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72   index with pPar
29be0 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20  tIndexWhere can 
29bf0 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68  be used.** in th
29c00 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
29c10 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
29c20 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66   it can be and f
29c30 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
29c40 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
29c50 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
29c60 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65  ex(int iTab, Whe
29c70 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
29c80 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20  xpr *pWhere){.  
29c90 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
29ca0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66 6f 72  rm *pTerm;.  for
29cb0 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  (i=0, pTerm=pWC-
29cc0 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
29cd0 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
29ce0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
29cf0 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
29d00 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 70 57  pTerm->pExpr, pW
29d10 68 65 72 65 2c 20 69 54 61 62 29 20 29 20 72 65  here, iTab) ) re
29d20 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
29d30 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
29d40 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
29d50 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
29d60 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66   single table of
29d70 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20   the join where 
29d80 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  the table.** is 
29d90 69 64 65 6e 66 69 65 64 20 62 79 20 70 42 75 69  idenfied by pBui
29da0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
29db0 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
29dc0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
29dd0 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61  e.** a b-tree ta
29de0 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75  ble, not a virtu
29df0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
29e00 54 68 65 20 63 6f 73 74 73 20 28 57 68 65 72 65  The costs (Where
29e10 4c 6f 6f 70 2e 72 52 75 6e 29 20 6f 66 20 74 68  Loop.rRun) of th
29e20 65 20 62 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61  e b-tree loops a
29e30 64 64 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  dded by this fun
29e40 63 74 69 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c  ction.** are cal
29e50 63 75 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  culated as follo
29e60 77 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  ws:.**.** For a 
29e70 66 75 6c 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d  full scan, assum
29e80 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 28 6f  ing the table (o
29e90 72 20 69 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e  r index) contain
29ea0 73 20 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a  s nRow rows:.**.
29eb0 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52  **     cost = nR
29ec0 6f 77 20 2a 20 33 2e 30 20 20 20 20 20 20 20 20  ow * 3.0        
29ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66              // f
29ee0 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a  ull-table scan.*
29ef0 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
29f00 77 20 2a 20 4b 20 20 20 20 20 20 20 20 20 20 20  w * K           
29f10 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63             // sc
29f20 61 6e 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69  an of covering i
29f30 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74  ndex.**     cost
29f40 20 3d 20 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30   = nRow * (K+3.0
29f50 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
29f60 20 2f 2f 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d   // scan of non-
29f70 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
29f80 2a 0a 2a 2a 20 77 68 65 72 65 20 4b 20 69 73 20  *.** where K is 
29f90 61 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20  a value between 
29fa0 31 2e 31 20 61 6e 64 20 33 2e 30 20 73 65 74 20  1.1 and 3.0 set 
29fb0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6c  based on the rel
29fc0 61 74 69 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61  ative .** estima
29fd0 74 65 64 20 61 76 65 72 61 67 65 20 73 69 7a 65  ted average size
29fe0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
29ff0 64 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73 2e  d table records.
2a000 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e  .**.** For an in
2a010 64 65 78 20 73 63 61 6e 2c 20 77 68 65 72 65 20  dex scan, where 
2a020 6e 56 69 73 69 74 20 69 73 20 74 68 65 20 6e 75  nVisit is the nu
2a030 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20 72 6f  mber of index ro
2a040 77 73 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79  ws visited.** by
2a050 20 74 68 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e   the scan, and n
2a060 53 65 65 6b 20 69 73 20 74 68 65 20 6e 75 6d 62  Seek is the numb
2a070 65 72 20 6f 66 20 73 65 65 6b 20 6f 70 65 72 61  er of seek opera
2a080 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 6f  tions required o
2a090 6e 20 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  n .** the index 
2a0a0 62 2d 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  b-tree:.**.**   
2a0b0 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a    cost = nSeek *
2a0c0 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20   (log(nRow) + K 
2a0d0 2a 20 6e 56 69 73 69 74 29 20 20 20 20 20 20 20  * nVisit)       
2a0e0 20 20 20 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69     // covering i
2a0f0 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74  ndex.**     cost
2a100 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28   = nSeek * (log(
2a110 6e 52 6f 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20  nRow) + (K+3.0) 
2a120 2a 20 6e 56 69 73 69 74 29 20 20 20 20 2f 2f 20  * nVisit)    // 
2a130 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
2a140 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  ex.**.** Normall
2a150 79 2c 20 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e  y, nSeek is 1. n
2a160 53 65 65 6b 20 76 61 6c 75 65 73 20 67 72 65 61  Seek values grea
2a170 74 65 72 20 74 68 61 6e 20 31 20 63 6f 6d 65 20  ter than 1 come 
2a180 61 62 6f 75 74 20 69 66 20 74 68 65 20 0a 2a 2a  about if the .**
2a190 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
2a1a0 63 6c 75 64 65 73 20 22 78 20 49 4e 20 28 2e 2e  cludes "x IN (..
2a1b0 2e 2e 29 22 20 74 65 72 6d 73 20 75 73 65 64 20  ..)" terms used 
2a1c0 69 6e 20 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f  in place of "x=?
2a1d0 22 2e 20 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69  ". Or when .** i
2a1e0 6d 70 6c 69 63 69 74 20 22 78 20 49 4e 20 28 53  mplicit "x IN (S
2a1f0 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 62 6c  ELECT x FROM tbl
2a200 29 22 20 74 65 72 6d 73 20 61 72 65 20 61 64 64  )" terms are add
2a210 65 64 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e  ed for skip-scan
2a220 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74  s..**.** The est
2a230 69 6d 61 74 65 64 20 76 61 6c 75 65 73 20 28 6e  imated values (n
2a240 52 6f 77 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65  Row, nVisit, nSe
2a250 65 6b 29 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69  ek) often contai
2a260 6e 20 61 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74  n a large amount
2a270 0a 2a 2a 20 6f 66 20 75 6e 63 65 72 74 61 69 6e  .** of uncertain
2a280 74 79 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65  ty.  For this re
2a290 61 73 6f 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73  ason, scoring is
2a2a0 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 69 63   designed to pic
2a2b0 6b 20 70 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20  k plans that.** 
2a2c0 22 64 6f 20 74 68 65 20 6c 65 61 73 74 20 68 61  "do the least ha
2a2d0 72 6d 22 20 69 66 20 74 68 65 20 65 73 74 69 6d  rm" if the estim
2a2e0 61 74 65 73 20 61 72 65 20 69 6e 61 63 63 75 72  ates are inaccur
2a2f0 61 74 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ate.  For exampl
2a300 65 2c 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77  e, a.** log(nRow
2a310 29 20 66 61 63 74 6f 72 20 69 73 20 6f 6d 69 74  ) factor is omit
2a320 74 65 64 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63  ted from a non-c
2a330 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63  overing index sc
2a340 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a  an in order to.*
2a350 2a 20 62 69 61 73 20 74 68 65 20 73 63 6f 72 69  * bias the scori
2a360 6e 67 20 69 6e 20 66 61 76 6f 72 20 6f 66 20 75  ng in favor of u
2a370 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 73  sing an index, s
2a380 69 6e 63 65 20 74 68 65 20 77 6f 72 73 74 2d 63  ince the worst-c
2a390 61 73 65 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ase.** performan
2a3a0 63 65 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69  ce of using an i
2a3b0 6e 64 65 78 20 69 73 20 66 61 72 20 62 65 74 74  ndex is far bett
2a3c0 65 72 20 74 68 61 6e 20 74 68 65 20 77 6f 72 73  er than the wors
2a3d0 74 2d 63 61 73 65 20 70 65 72 66 6f 72 6d 61 6e  t-case performan
2a3e0 63 65 0a 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20  ce.** of a full 
2a3f0 74 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73  table scan..*/.s
2a400 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
2a410 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20 57  oopAddBtree(.  W
2a420 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2a430 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48  *pBuilder, /* WH
2a440 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72  ERE clause infor
2a450 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  mation */.  Bitm
2a460 61 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20  ask mExtra      
2a470 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
2a480 20 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66   prerequesites f
2a490 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61  or using this ta
2a4a0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ble */.){.  Wher
2a4b0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
2a4c0 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
2a4d0 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78   analysis contex
2a4e0 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  t */.  Index *pP
2a4f0 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  robe;           
2a500 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77     /* An index w
2a510 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
2a520 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b   */.  Index sPk;
2a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a540 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65    /* A fake inde
2a550 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65  x object for the
2a560 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a   primary key */.
2a570 20 20 4c 6f 67 45 73 74 20 61 69 52 6f 77 45 73    LogEst aiRowEs
2a580 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a  tPk[2];       /*
2a590 20 54 68 65 20 61 69 52 6f 77 4c 6f 67 45 73 74   The aiRowLogEst
2a5a0 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
2a5b0 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
2a5c0 69 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d  i16 aiColumnPk =
2a5d0 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54   -1;        /* T
2a5e0 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c  he aColumn[] val
2a5f0 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
2a600 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ndex */.  SrcLis
2a610 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
2a620 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
2a630 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  M clause */.  st
2a640 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2a650 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65  m *pSrc;  /* The
2a660 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72   FROM clause btr
2a670 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a  ee term to add *
2a680 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
2a690 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
2a6a0 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72  /* Template Wher
2a6b0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
2a6c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a6d0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a  E_OK;         /*
2a6e0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2a6f0 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d    int iSortIdx =
2a700 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   1;           /*
2a710 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   Index number */
2a720 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20  .  int b;       
2a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a740 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  * A boolean valu
2a750 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53  e */.  LogEst rS
2a760 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2a770 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20     /* number of 
2a780 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
2a790 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c  e */.  LogEst rL
2a7a0 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ogSize;         
2a7b0 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
2a7c0 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
2a7d0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
2a7e0 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  le */.  WhereCla
2a7f0 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20  use *pWC;       
2a800 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
2a810 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  d WHERE clause *
2a820 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
2a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a840 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71  /* Table being q
2a850 75 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70  ueried */.  .  p
2a860 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
2a870 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  pNew;.  pWInfo =
2a880 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
2a890 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  o;.  pTabList = 
2a8a0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2a8b0 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c  ;.  pSrc = pTabL
2a8c0 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
2a8d0 54 61 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53  Tab;.  pTab = pS
2a8e0 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20  rc->pTab;.  pWC 
2a8f0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
2a900 0a 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69  .  assert( !IsVi
2a910 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62  rtual(pSrc->pTab
2a920 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63  ) );..  if( pSrc
2a930 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->pIndex ){.    
2a940 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59  /* An INDEXED BY
2a950 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65   clause specifie
2a960 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  s a particular i
2a970 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ndex to use */. 
2a980 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63     pProbe = pSrc
2a990 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  ->pIndex;.  }els
2a9a0 65 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28  e if( !HasRowid(
2a9b0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72  pTab) ){.    pPr
2a9c0 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  obe = pTab->pInd
2a9d0 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
2a9e0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
2a9f0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2aa00 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b  e.  Create a fak
2aa10 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  e Index object i
2aa20 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76  n local.    ** v
2aa30 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72  ariable sPk to r
2aa40 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77  epresent the row
2aa50 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  id primary key i
2aa60 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73  ndex.  Make this
2aa70 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64  .    ** fake ind
2aa80 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  ex the first in 
2aa90 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78  a chain of Index
2aaa0 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c   objects with al
2aab0 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20  l of the real.  
2aac0 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
2aad0 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e  follow */.    In
2aae0 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20  dex *pFirst;    
2aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ab00 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69   First of real i
2ab10 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61  ndices on the ta
2ab20 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ble */.    memse
2ab30 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f  t(&sPk, 0, sizeo
2ab40 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73  f(Index));.    s
2ab50 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a  Pk.nKeyCol = 1;.
2ab60 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20      sPk.nColumn 
2ab70 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43  = 1;.    sPk.aiC
2ab80 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d  olumn = &aiColum
2ab90 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52  nPk;.    sPk.aiR
2aba0 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77  owLogEst = aiRow
2abb0 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f  EstPk;.    sPk.o
2abc0 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c  nError = OE_Repl
2abd0 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61  ace;.    sPk.pTa
2abe0 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  ble = pTab;.    
2abf0 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70  sPk.szIdxRow = p
2ac00 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
2ac10 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d     aiRowEstPk[0]
2ac20 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67   = pTab->nRowLog
2ac30 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Est;.    aiRowEs
2ac40 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  tPk[1] = 0;.    
2ac50 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70  pFirst = pSrc->p
2ac60 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
2ac70 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e   if( pSrc->notIn
2ac80 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  dexed==0 ){.    
2ac90 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e    /* The real in
2aca0 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62  dices of the tab
2acb0 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73  le are only cons
2acc0 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20  idered if the.  
2acd0 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58      ** NOT INDEX
2ace0 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  ED qualifier is 
2acf0 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
2ad00 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2ad10 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20        sPk.pNext 
2ad20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a  = pFirst;.    }.
2ad30 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50      pProbe = &sP
2ad40 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d  k;.  }.  rSize =
2ad50 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
2ad60 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20  t;.  rLogSize = 
2ad70 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a  estLog(rSize);..
2ad80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2ad90 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
2ada0 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74  DEX.  /* Automat
2adb0 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  ic indexes */.  
2adc0 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70  if( !pBuilder->p
2add0 4f 72 53 65 74 0a 20 20 20 26 26 20 28 70 57 49  OrSet.   && (pWI
2ade0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  nfo->pParse->db-
2adf0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2ae00 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20  AutoIndex)!=0.  
2ae10 20 26 26 20 70 53 72 63 2d 3e 70 49 6e 64 65 78   && pSrc->pIndex
2ae20 3d 3d 30 0a 20 20 20 26 26 20 21 70 53 72 63 2d  ==0.   && !pSrc-
2ae30 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20 20  >viaCoroutine.  
2ae40 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e   && !pSrc->notIn
2ae50 64 65 78 65 64 0a 20 20 20 26 26 20 48 61 73 52  dexed.   && HasR
2ae60 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 26 26  owid(pTab).   &&
2ae70 20 21 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c   !pSrc->isCorrel
2ae80 61 74 65 64 0a 20 20 20 26 26 20 21 70 53 72 63  ated.   && !pSrc
2ae90 2d 3e 69 73 52 65 63 75 72 73 69 76 65 0a 20 20  ->isRecursive.  
2aea0 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ){.    /* Genera
2aeb0 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68  te auto-index Wh
2aec0 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  ereLoops */.    
2aed0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2aee0 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
2aef0 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61  *pWCEnd = pWC->a
2af00 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
2af10 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
2af20 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ->a; rc==SQLITE_
2af30 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45  OK && pTerm<pWCE
2af40 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
2af50 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
2af60 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
2af70 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
2af80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
2af90 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
2afa0 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
2afb0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
2afc0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
2afd0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
2afe0 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  ew->nSkip = 0;. 
2aff0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
2b000 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
2b010 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
2b020 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
2b030 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
2b040 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
2b050 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f      /* TUNING: O
2b060 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72  ne-time cost for
2b070 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61   computing the a
2b080 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
2b090 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 73 74  s.        ** est
2b0a0 69 6d 61 74 65 64 20 74 6f 20 62 65 20 58 2a 4e  imated to be X*N
2b0b0 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e  *log2(N) where N
2b0c0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2b0d0 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20  f rows in.      
2b0e0 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
2b0f0 65 69 6e 67 20 69 6e 64 65 78 65 64 20 61 6e 64  eing indexed and
2b100 20 77 68 65 72 65 20 58 20 69 73 20 37 20 28 4c   where X is 7 (L
2b110 6f 67 45 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f  ogEst=28) for no
2b120 72 6d 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rmal.        ** 
2b130 74 61 62 6c 65 73 20 6f 72 20 31 2e 33 37 35 20  tables or 1.375 
2b140 28 4c 6f 67 45 73 74 3d 34 29 20 66 6f 72 20 76  (LogEst=4) for v
2b150 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
2b160 69 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a  ies.  The value.
2b170 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20          ** of X 
2b180 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76  is smaller for v
2b190 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
2b1a0 69 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ies so that the 
2b1b0 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20  query planner.  
2b1c0 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
2b1d0 20 6d 6f 72 65 20 61 67 67 72 65 73 73 69 76 65   more aggressive
2b1e0 20 61 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e   about generatin
2b1f0 67 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  g automatic inde
2b200 78 65 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20  xes for.        
2b210 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73  ** those objects
2b220 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  , since there is
2b230 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   no opportunity 
2b240 74 6f 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20  to add schema.  
2b250 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73        ** indexes
2b260 20 6f 6e 20 73 75 62 71 75 65 72 69 65 73 20 61   on subqueries a
2b270 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20  nd views. */.   
2b280 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
2b290 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72  p = rLogSize + r
2b2a0 53 69 7a 65 20 2b 20 34 3b 0a 20 20 20 20 20 20  Size + 4;.      
2b2b0 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
2b2c0 65 63 74 3d 3d 30 20 26 26 20 28 70 54 61 62 2d  ect==0 && (pTab-
2b2d0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
2b2e0 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a  phemeral)==0 ){.
2b2f0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2b300 72 53 65 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20  rSetup += 24;.  
2b310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b320 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
2b330 69 65 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70  ier(pNew->rSetup
2b340 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74  , pTab->costMult
2b350 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  );.        /* TU
2b360 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78  NING: Each index
2b370 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32   lookup yields 2
2b380 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  0 rows in the ta
2b390 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20  ble.  This.     
2b3a0 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68     ** is more th
2b3b0 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75 65  an the usual gue
2b3c0 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73  ss of 10 rows, s
2b3d0 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20  ince we have no 
2b3e0 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  way.        ** o
2b3f0 66 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65  f knowing how se
2b400 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e 64 65  lective the inde
2b410 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c  x will ultimatel
2b420 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a  y be.  It would.
2b430 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62          ** not b
2b440 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74  e unreasonable t
2b450 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75  o make this valu
2b460 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a  e much larger. *
2b470 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
2b480 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65  nOut = 43;  asse
2b490 72 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c  rt( 43==sqlite3L
2b4a0 6f 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20  ogEst(20) );.   
2b4b0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2b4c0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
2b4d0 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77  dd(rLogSize,pNew
2b4e0 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  ->nOut);.       
2b4f0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
2b500 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
2b510 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  X;.        pNew-
2b520 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
2b530 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
2b540 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72  Right;.        r
2b550 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2b560 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2b570 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
2b580 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
2b590 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2b5a0 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
2b5b0 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
2b5c0 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f  all indices.  */
2b5d0 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c  .  for(; rc==SQL
2b5e0 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65  ITE_OK && pProbe
2b5f0 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d  ; pProbe=pProbe-
2b600 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78  >pNext, iSortIdx
2b610 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72  ++){.    if( pPr
2b620 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65  obe->pPartIdxWhe
2b630 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77  re!=0.     && !w
2b640 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
2b650 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e 69 43 75  lIndex(pSrc->iCu
2b660 72 73 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f 62  rsor, pWC, pProb
2b670 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  e->pPartIdxWhere
2b680 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ) ){.      testc
2b690 61 73 65 28 20 70 4e 65 77 2d 3e 69 54 61 62 21  ase( pNew->iTab!
2b6a0 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
2b6b0 3b 20 20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74  ;  /* See ticket
2b6c0 20 5b 39 38 64 39 37 33 62 38 66 35 5d 20 2a 2f   [98d973b8f5] */
2b6d0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
2b6e0 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64    /* Partial ind
2b6f0 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65  ex inappropriate
2b700 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 20   for this query 
2b710 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72 53 69  */.    }.    rSi
2b720 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
2b730 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20  owLogEst[0];.   
2b740 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
2b750 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  Eq = 0;.    pNew
2b760 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  ->nSkip = 0;.   
2b770 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
2b780 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  0;.    pNew->iSo
2b790 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70  rtIdx = 0;.    p
2b7a0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
2b7b0 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
2b7c0 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20  q = mExtra;.    
2b7d0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
2b7e0 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ze;.    pNew->u.
2b7f0 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
2b800 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69  Probe;.    b = i
2b810 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
2b820 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65  hOrderBy(pBuilde
2b830 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d  r, pProbe, pSrc-
2b840 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f  >iCursor);.    /
2b850 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45  * The ONEPASS_DE
2b860 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65  SIRED flags neve
2b870 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65  r occurs togethe
2b880 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20  r with ORDER BY 
2b890 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
2b8a0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2b8b0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2b8c0 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
2b8d0 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  | b==0 );.    if
2b8e0 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  ( pProbe->tnum<=
2b8f0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  0 ){.      /* In
2b900 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65  teger primary ke
2b910 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  y index */.     
2b920 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
2b930 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20   WHERE_IPK;..   
2b940 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65     /* Full table
2b950 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70   scan */.      p
2b960 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
2b970 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
2b980 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
2b990 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20  G: Cost of full 
2b9a0 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e  table scan is (N
2b9b0 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20  *3.0). */.      
2b9c0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69  pNew->rRun = rSi
2b9d0 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 41  ze + 16;.      A
2b9e0 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
2b9f0 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  er(pNew->rRun, p
2ba00 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
2ba10 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f        whereLoopO
2ba20 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c  utputAdjust(pWC,
2ba30 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20   pNew, rSize);. 
2ba40 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2ba50 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
2ba60 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
2ba70 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
2ba80 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ize;.      if( r
2ba90 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  c ) break;.    }
2baa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
2bab0 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28  ask m;.      if(
2bac0 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72   pProbe->isCover
2bad0 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ing ){.        p
2bae0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
2baf0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20  HERE_IDX_ONLY | 
2bb00 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
2bb10 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20         m = 0;.  
2bb20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bb30 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c     m = pSrc->col
2bb40 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49  Used & ~columnsI
2bb50 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a  nIndex(pProbe);.
2bb60 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
2bb70 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f  Flags = (m==0) ?
2bb80 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
2bb90 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20  |WHERE_INDEXED) 
2bba0 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  : WHERE_INDEXED;
2bbb0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2bbc0 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61  /* Full scan via
2bbd0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
2bbe0 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20  if( b.       || 
2bbf0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a  !HasRowid(pTab).
2bc00 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30         || ( m==0
2bc10 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72  .         && pPr
2bc20 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  obe->bUnordered=
2bc30 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
2bc40 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
2bc50 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29  <pTab->szTabRow)
2bc60 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57  .         && (pW
2bc70 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2bc80 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2bc90 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20  _DESIRED)==0.   
2bca0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
2bcb0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
2bcc0 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26  eCis.         &&
2bcd0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
2bce0 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61  bled(pWInfo->pPa
2bcf0 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
2bd00 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20  CoverIdxScan).  
2bd10 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
2bd20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
2bd30 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
2bd40 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20  iSortIdx : 0;.. 
2bd50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
2bd60 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74  st of visiting t
2bd70 68 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73  he index rows is
2bd80 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73   N*K, where K is
2bd90 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77  .        ** betw
2bda0 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c  een 1.1 and 3.0,
2bdb0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
2bdc0 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73  e relative sizes
2bdd0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
2bde0 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  ** index and tab
2bdf0 6c 65 20 72 6f 77 73 2e 20 49 66 20 74 68 69 73  le rows. If this
2be00 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
2be10 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20  ng index scan,. 
2be20 20 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61         ** also a
2be30 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76  dd the cost of v
2be40 69 73 69 74 69 6e 67 20 74 61 62 6c 65 20 72 6f  isiting table ro
2be50 77 73 20 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a  ws (N*3.0).  */.
2be60 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
2be70 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b  un = rSize + 1 +
2be80 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49   (15*pProbe->szI
2be90 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54  dxRow)/pTab->szT
2bea0 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69  abRow;.        i
2beb0 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20  f( m!=0 ){.     
2bec0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2bed0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
2bee0 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72  dd(pNew->rRun, r
2bef0 53 69 7a 65 2b 31 36 29 3b 0a 20 20 20 20 20 20  Size+16);.      
2bf00 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c    }.        Appl
2bf10 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
2bf20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62  pNew->rRun, pTab
2bf30 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
2bf40 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
2bf50 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
2bf60 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20  pNew, rSize);.  
2bf70 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2bf80 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
2bf90 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
2bfa0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2bfb0 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20   rSize;.        
2bfc0 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2bfd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2bfe0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2bff0 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
2c000 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
2c010 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65  Probe, 0);.#ifde
2c020 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2c030 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
2c040 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50     sqlite3Stat4P
2c050 72 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65  robeFree(pBuilde
2c060 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42  r->pRec);.    pB
2c070 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
2c080 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c  d = 0;.    pBuil
2c090 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23  der->pRec = 0;.#
2c0a0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
2c0b0 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e   there was an IN
2c0c0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
2c0d0 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20   then only that 
2c0e0 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20  one index is.   
2c0f0 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   ** considered. 
2c100 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  */.    if( pSrc-
2c110 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b  >pIndex ) break;
2c120 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2c130 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
2c140 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2c150 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20  TABLE./*.** Add 
2c160 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
2c170 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c  jects for a tabl
2c180 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64  e of the join id
2c190 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70  entified by.** p
2c1a0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69  Builder->pNew->i
2c1b0 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65  Tab.  That table
2c1c0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2c1d0 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74  o be a virtual t
2c1e0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
2c1f0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
2c200 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65  Virtual(.  Where
2c210 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
2c220 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45  ilder,  /* WHERE
2c230 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
2c240 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
2c250 20 6d 45 78 74 72 61 0a 29 7b 0a 20 20 57 68 65   mExtra.){.  Whe
2c260 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
2c270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
2c280 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
2c290 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
2c2a0 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
2c2b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
2c2c0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
2c2d0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2c2e0 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  WC;            /
2c2f0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
2c300 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
2c310 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
2c320 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
2c330 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
2c340 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c  search */.  Tabl
2c350 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
2c360 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65  e3 *db;.  sqlite
2c370 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
2c380 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  dxInfo;.  struct
2c390 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
2c3a0 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
2c3b0 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
2c3c0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
2c3d0 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
2c3e0 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72  sage;.  WhereTer
2c3f0 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
2c400 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72  i, j;.  int iTer
2c410 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74  m, mxTerm;.  int
2c420 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20   nConstraint;.  
2c430 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20  int seenIn = 0; 
2c440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c450 54 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70  True if an IN op
2c460 65 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a  erator is seen *
2c470 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20  /.  int seenVar 
2c480 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2c490 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f   /* True if a no
2c4a0 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74  n-constant const
2c4b0 72 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f  raint is seen */
2c4c0 0a 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20  .  int iPhase;  
2c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4e0 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20  /* 0: const w/o 
2c4f0 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a  IN, 1: const, 2:
2c500 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a   no IN,  2: IN *
2c510 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
2c520 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
2c530 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57  SQLITE_OK;..  pW
2c540 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
2c550 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73  >pWInfo;.  pPars
2c560 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
2c570 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
2c580 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20 70  e->db;.  pWC = p
2c590 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
2c5a0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
2c5b0 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20  >pNew;.  pSrc = 
2c5c0 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
2c5d0 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d  t->a[pNew->iTab]
2c5e0 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
2c5f0 3e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28  >pTab;.  assert(
2c600 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
2c610 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d   );.  pIdxInfo =
2c620 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e   allocateIndexIn
2c630 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  fo(pParse, pWC, 
2c640 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e  pSrc, pBuilder->
2c650 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28  pOrderBy);.  if(
2c660 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72   pIdxInfo==0 ) r
2c670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2c680 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72  EM;.  pNew->prer
2c690 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  eq = 0;.  pNew->
2c6a0 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e  rSetup = 0;.  pN
2c6b0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
2c6c0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
2c6d0 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ;.  pNew->nLTerm
2c6e0 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e   = 0;.  pNew->u.
2c6f0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
2c700 30 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49  0;.  pUsage = pI
2c710 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
2c720 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e  intUsage;.  nCon
2c730 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e  straint = pIdxIn
2c740 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
2c750 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  .  if( whereLoop
2c760 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
2c770 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b   nConstraint) ){
2c780 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2c790 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29  ee(db, pIdxInfo)
2c7a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2c7b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
2c7c0 20 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20    for(iPhase=0; 
2c7d0 69 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73  iPhase<=3; iPhas
2c7e0 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  e++){.    if( !s
2c7f0 65 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65  eenIn && (iPhase
2c800 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  &1)!=0 ){.      
2c810 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20  iPhase++;.      
2c820 69 66 28 20 69 50 68 61 73 65 3e 33 20 29 20 62  if( iPhase>3 ) b
2c830 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2c840 69 66 28 20 21 73 65 65 6e 56 61 72 20 26 26 20  if( !seenVar && 
2c850 69 50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b  iPhase>1 ) break
2c860 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d  ;.    pIdxCons =
2c870 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
2c880 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
2c890 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
2c8a0 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  aConstraint;.   
2c8b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
2c8c0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
2c8d0 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73  t; i++, pIdxCons
2c8e0 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70  ++){.      j = p
2c8f0 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
2c900 66 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72  fset;.      pTer
2c910 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
2c920 20 20 20 20 20 20 73 77 69 74 63 68 28 20 69 50        switch( iP
2c930 68 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  hase ){.        
2c940 63 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f  case 0:    /* Co
2c950 6e 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20  nstants without 
2c960 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
2c970 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
2c980 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20  s->usable = 0;. 
2c990 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
2c9a0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2c9b0 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20   WO_IN)!=0 ){.  
2c9c0 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e            seenIn
2c9d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2c9e0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2c9f0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
2ca00 68 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ht!=0 ){.       
2ca10 20 20 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31       seenVar = 1
2ca20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2ca30 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f  e if( (pTerm->eO
2ca40 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
2ca50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2ca60 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
2ca70 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ble = 1;.       
2ca80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
2ca90 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
2caa0 73 65 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73  se 1:    /* Cons
2cab0 74 61 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70  tants with IN op
2cac0 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20  erators */.     
2cad0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65       assert( see
2cae0 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nIn );.         
2caf0 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
2cb00 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  e = (pTerm->prer
2cb10 65 71 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20  eqRight==0);.   
2cb20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2cb30 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 20 20        case 2:   
2cb40 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69   /* Variables wi
2cb50 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20  thout IN */.    
2cb60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
2cb70 65 6e 56 61 72 20 29 3b 0a 20 20 20 20 20 20 20  enVar );.       
2cb80 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
2cb90 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f  ble = (pTerm->eO
2cba0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
2cbb0 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ==0;.          b
2cbc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65  reak;.        de
2cbd0 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69  fault:   /* Vari
2cbe0 61 62 6c 65 73 20 77 69 74 68 20 49 4e 20 2a 2f  ables with IN */
2cbf0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2cc00 74 28 20 73 65 65 6e 56 61 72 20 26 26 20 73 65  t( seenVar && se
2cc10 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  enIn );.        
2cc20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
2cc30 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  le = 1;.        
2cc40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2cc50 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
2cc60 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a  t(pUsage, 0, siz
2cc70 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70  eof(pUsage[0])*p
2cc80 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
2cc90 61 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  aint);.    if( p
2cca0 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
2ccb0 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69  reeIdxStr ) sqli
2ccc0 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66  te3_free(pIdxInf
2ccd0 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  o->idxStr);.    
2cce0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
2ccf0 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
2cd00 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a  fo->idxNum = 0;.
2cd10 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65      pIdxInfo->ne
2cd20 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
2cd30 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
2cd40 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
2cd50 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  d = 0;.    pIdxI
2cd60 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
2cd70 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
2cd80 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b  DBL / (double)2;
2cd90 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
2cda0 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32  stimatedRows = 2
2cdb0 35 3b 0a 20 20 20 20 72 63 20 3d 20 76 74 61 62  5;.    rc = vtab
2cdc0 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  BestIndex(pParse
2cdd0 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f  , pTab, pIdxInfo
2cde0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2cdf0 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64  goto whereLoopAd
2ce00 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20  dVtab_exit;.    
2ce10 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
2ce20 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
2ce30 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
2ce40 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
2ce50 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d  raint;.    pNew-
2ce60 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
2ce70 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d  ;.    mxTerm = -
2ce80 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
2ce90 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f  New->nLSlot>=nCo
2cea0 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20  nstraint );.    
2ceb0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
2cec0 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65  traint; i++) pNe
2ced0 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30  w->aLTerm[i] = 0
2cee0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74  ;.    pNew->u.vt
2cef0 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b  ab.omitMask = 0;
2cf00 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2cf10 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
2cf20 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
2cf30 20 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20       if( (iTerm 
2cf40 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  = pUsage[i].argv
2cf50 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b  Index - 1)>=0 ){
2cf60 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64  .        j = pId
2cf70 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
2cf80 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  et;.        if( 
2cf90 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69  iTerm>=nConstrai
2cfa0 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  nt.         || j
2cfb0 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  <0.         || j
2cfc0 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20  >=pWC->nTerm.   
2cfd0 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61        || pNew->a
2cfe0 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a  LTerm[iTerm]!=0.
2cff0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2d000 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2d010 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
2d020 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2d030 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42  g(pParse, "%s.xB
2d040 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75  estIndex() malfu
2d050 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a  nction", pTab->z
2d060 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2d070 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
2d080 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
2d090 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
2d0a0 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
2d0b0 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b  nConstraint-1 );
2d0c0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2d0d0 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( j==0 );.     
2d0e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
2d0f0 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a  pWC->nTerm-1 );.
2d100 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
2d110 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
2d120 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2d130 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65   |= pTerm->prere
2d140 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
2d150 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e  assert( iTerm<pN
2d160 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
2d170 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
2d180 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72  rm[iTerm] = pTer
2d190 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  m;.        if( i
2d1a0 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78  Term>mxTerm ) mx
2d1b0 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20  Term = iTerm;.  
2d1c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2d1d0 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20  iTerm==15 );.   
2d1e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2d1f0 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20  Term==16 );.    
2d200 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36      if( iTerm<16
2d210 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d   && pUsage[i].om
2d220 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61  it ) pNew->u.vta
2d230 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c  b.omitMask |= 1<
2d240 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  <iTerm;.        
2d250 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2d260 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
2d270 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
2d280 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  f( pUsage[i].omi
2d290 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
2d2a0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74      /* Do not at
2d2b0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20  tempt to use an 
2d2c0 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66  IN constraint if
2d2d0 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
2d2e0 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
2d2f0 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20  * says that the 
2d300 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f  equivalent EQ co
2d310 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
2d320 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65  be safely omitte
2d330 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  d..            *
2d340 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d  * If we do attem
2d350 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20 61  pt to use such a
2d360 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d   constraint, som
2d370 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a  e rows might be.
2d380 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
2d390 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f  epeated in the o
2d3a0 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20  utput. */.      
2d3b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2d3c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d3d0 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20     /* A virtual 
2d3e0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f  table that is co
2d3f0 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20  nstrained by an 
2d400 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f  IN clause may no
2d410 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
2d420 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52  onsume the ORDER
2d430 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61 75   BY clause becau
2d440 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65 72  se (1) the order
2d450 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20   of IN terms.   
2d460 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
2d470 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c   necessarily rel
2d480 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65  ated to the orde
2d490 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d  r of output term
2d4a0 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  s and.          
2d4b0 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20  ** (2) Multiple 
2d4c0 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73  outputs from a s
2d4d0 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77  ingle IN value w
2d4e0 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20  ill not merge.  
2d4f0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74          ** toget
2d500 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  her.  */.       
2d510 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64     pIdxInfo->ord
2d520 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
2d530 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d540 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2d550 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ( i>=nConstraint
2d560 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
2d570 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b  nLTerm = mxTerm+
2d580 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
2d590 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70   pNew->nLTerm<=p
2d5a0 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
2d5b0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
2d5c0 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49  b.idxNum = pIdxI
2d5d0 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20  nfo->idxNum;.   
2d5e0 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2d5f0 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49  needFree = pIdxI
2d600 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2d610 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64  dxStr;.      pId
2d620 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2d630 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
2d640 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2d650 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66  idxStr = pIdxInf
2d660 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20  o->idxStr;.     
2d670 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73   pNew->u.vtab.is
2d680 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29 28 70  Ordered = (i8)(p
2d690 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
2d6a0 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20 20  Consumed ?.     
2d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6d0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65   pIdxInfo->nOrde
2d6e0 72 42 79 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  rBy : 0);.      
2d6f0 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
2d700 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  ;.      pNew->rR
2d710 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
2d720 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64  stFromDouble(pId
2d730 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
2d740 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 70 4e 65  Cost);.      pNe
2d750 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65  w->nOut = sqlite
2d760 33 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f  3LogEst(pIdxInfo
2d770 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29  ->estimatedRows)
2d780 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
2d790 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
2d7a0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69  , pNew);.      i
2d7b0 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  f( pNew->u.vtab.
2d7c0 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20  needFree ){.    
2d7d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2d7e0 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64  (pNew->u.vtab.id
2d7f0 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20 70  xStr);.        p
2d800 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
2d810 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
2d820 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77  }.    }.  }  ..w
2d830 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f  hereLoopAddVtab_
2d840 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64 78  exit:.  if( pIdx
2d850 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
2d860 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33  IdxStr ) sqlite3
2d870 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
2d880 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  idxStr);.  sqlit
2d890 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64  e3DbFree(db, pId
2d8a0 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  xInfo);.  return
2d8b0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
2d8c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2d8d0 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
2d8e0 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f  .** Add WhereLoo
2d8f0 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e  p entries to han
2d900 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54  dle OR terms.  T
2d910 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69  his works for ei
2d920 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f  ther.** btrees o
2d930 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  r virtual tables
2d940 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d950 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 57  whereLoopAddOr(W
2d960 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2d970 2a 70 42 75 69 6c 64 65 72 2c 20 42 69 74 6d 61  *pBuilder, Bitma
2d980 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20 57 68  sk mExtra){.  Wh
2d990 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
2d9a0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
2d9b0 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  fo;.  WhereClaus
2d9c0 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c  e *pWC;.  WhereL
2d9d0 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65  oop *pNew;.  Whe
2d9e0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
2d9f0 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63  pWCEnd;.  int rc
2da00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2da10 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72  int iCur;.  Wher
2da20 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a  eClause tempWC;.
2da30 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
2da40 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20  er sSubBuild;.  
2da50 57 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c  WhereOrSet sSum,
2da60 20 73 43 75 72 3b 0a 20 20 73 74 72 75 63 74 20   sCur;.  struct 
2da70 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2da80 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20  tem;.  .  pWC = 
2da90 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
2daa0 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61   pWCEnd = pWC->a
2dab0 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
2dac0 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
2dad0 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74  ->pNew;.  memset
2dae0 28 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f  (&sSum, 0, sizeo
2daf0 66 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65  f(sSum));.  pIte
2db00 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
2db10 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e  List->a + pNew->
2db20 69 54 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70  iTab;.  iCur = p
2db30 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a  Item->iCursor;..
2db40 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
2db50 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
2db60 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2db70 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  K; pTerm++){.   
2db80 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
2db90 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21  erator & WO_OR)!
2dba0 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  =0.     && (pTer
2dbb0 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  m->u.pOrInfo->in
2dbc0 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e  dexable & pNew->
2dbd0 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20  maskSelf)!=0 .  
2dbe0 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65    ){.      Where
2dbf0 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70  Clause * const p
2dc00 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75  OrWC = &pTerm->u
2dc10 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  .pOrInfo->wc;.  
2dc20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20      WhereTerm * 
2dc30 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d  const pOrWCEnd =
2dc40 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43   &pOrWC->a[pOrWC
2dc50 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  ->nTerm];.      
2dc60 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
2dc70 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e  rm;.      int on
2dc80 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e  ce = 1;.      in
2dc90 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20  t i, j;.    .   
2dca0 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a     sSubBuild = *
2dcb0 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20  pBuilder;.      
2dcc0 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72  sSubBuild.pOrder
2dcd0 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53  By = 0;.      sS
2dce0 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d  ubBuild.pOrSet =
2dcf0 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 57   &sCur;..      W
2dd00 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c  HERETRACE(0x200,
2dd10 20 28 22 42 65 67 69 6e 20 70 72 6f 63 65 73 73   ("Begin process
2dd20 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70  ing OR-clause %p
2dd30 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20  \n", pTerm));.  
2dd40 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d      for(pOrTerm=
2dd50 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72  pOrWC->a; pOrTer
2dd60 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54  m<pOrWCEnd; pOrT
2dd70 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
2dd80 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f  if( (pOrTerm->eO
2dd90 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44  perator & WO_AND
2dda0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2ddb0 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20    sSubBuild.pWC 
2ddc0 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41  = &pOrTerm->u.pA
2ddd0 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  ndInfo->wc;.    
2dde0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
2ddf0 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
2de00 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20  r==iCur ){.     
2de10 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e       tempWC.pWIn
2de20 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  fo = pWC->pWInfo
2de30 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
2de40 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b  WC.pOuter = pWC;
2de50 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
2de60 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  C.op = TK_AND;. 
2de70 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
2de80 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  nTerm = 1;.     
2de90 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20       tempWC.a = 
2dea0 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  pOrTerm;.       
2deb0 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43     sSubBuild.pWC
2dec0 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20   = &tempWC;.    
2ded0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2dee0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2def0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2df00 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66   sCur.n = 0;.#if
2df10 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
2df20 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 57  NABLED.        W
2df30 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c  HERETRACE(0x200,
2df40 20 28 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66   ("OR-term %d of
2df50 20 25 70 20 68 61 73 20 25 64 20 73 75 62 74 65   %p has %d subte
2df60 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20  rms:\n", .      
2df70 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
2df80 74 29 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43  t)(pOrTerm-pOrWC
2df90 2d 3e 61 29 2c 20 70 54 65 72 6d 2c 20 73 53 75  ->a), pTerm, sSu
2dfa0 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72  bBuild.pWC->nTer
2dfb0 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  m));.        if(
2dfc0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
2dfd0 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
2dfe0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2dff0 20 69 3c 73 53 75 62 42 75 69 6c 64 2e 70 57 43   i<sSubBuild.pWC
2e000 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  ->nTerm; i++){. 
2e010 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
2e020 54 65 72 6d 50 72 69 6e 74 28 26 73 53 75 62 42  TermPrint(&sSubB
2e030 75 69 6c 64 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20  uild.pWC->a[i], 
2e040 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  i);.          }.
2e050 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
2e060 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e070 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2e080 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  E.        if( Is
2e090 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
2e0a0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
2e0b0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2e0c0 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62  AddVirtual(&sSub
2e0d0 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a  Build, mExtra);.
2e0e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
2e0f0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
2e100 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
2e110 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
2e120 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74  &sSubBuild, mExt
2e130 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ra);.        }. 
2e140 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2e150 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e160 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2e170 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53 75 62 42  LoopAddOr(&sSubB
2e180 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20  uild, mExtra);. 
2e190 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e1a0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
2e1b0 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e  ITE_OK || sCur.n
2e1c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
2e1d0 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a  f( sCur.n==0 ){.
2e1e0 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e            sSum.n
2e1f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2e200 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
2e210 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b  else if( once ){
2e220 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65  .          where
2e230 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73  OrMove(&sSum, &s
2e240 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cur);.          
2e250 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  once = 0;.      
2e260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e270 20 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 50     WhereOrSet sP
2e280 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 77  rev;.          w
2e290 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72 65  hereOrMove(&sPre
2e2a0 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20 20  v, &sSum);.     
2e2b0 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b       sSum.n = 0;
2e2c0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
2e2d0 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69  =0; i<sPrev.n; i
2e2e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2e2f0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72   for(j=0; j<sCur
2e300 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; j++){.      
2e310 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 49          whereOrI
2e320 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50 72  nsert(&sSum, sPr
2e330 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c  ev.a[i].prereq |
2e340 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65   sCur.a[j].prere
2e350 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  q,.             
2e360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2e370 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
2e380 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c  sPrev.a[i].rRun,
2e390 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29   sCur.a[j].rRun)
2e3a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2e3c0 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73  lite3LogEstAdd(s
2e3d0 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20  Prev.a[i].nOut, 
2e3e0 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29  sCur.a[j].nOut))
2e3f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2e400 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e410 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2e420 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
2e430 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 1;.      pNew
2e440 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
2e450 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  erm;.      pNew-
2e460 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
2e470 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20  _MULTI_OR;.     
2e480 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2e490 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  0;.      pNew->i
2e4a0 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20  SortIdx = 0;.   
2e4b0 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d     memset(&pNew-
2e4c0 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e  >u, 0, sizeof(pN
2e4d0 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20 66  ew->u));.      f
2e4e0 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
2e4f0 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e  TE_OK && i<sSum.
2e500 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
2e510 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 75 72 72   /* TUNING: Curr
2e520 65 6e 74 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e  ently sSum.a[i].
2e530 72 52 75 6e 20 69 73 20 73 65 74 20 74 6f 20 74  rRun is set to t
2e540 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 63 6f  he sum of the co
2e550 73 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  sts.        ** o
2e560 66 20 61 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20  f all sub-scans 
2e570 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
2e580 4f 52 2d 73 63 61 6e 2e 20 48 6f 77 65 76 65 72  OR-scan. However
2e590 2c 20 64 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e  , due to roundin
2e5a0 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72  g.        ** err
2e5b0 6f 72 73 2c 20 69 74 20 6d 61 79 20 62 65 20 74  ors, it may be t
2e5c0 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20  hat the cost of 
2e5d0 74 68 65 20 4f 52 2d 73 63 61 6e 20 69 73 20 65  the OR-scan is e
2e5e0 71 75 61 6c 20 74 6f 20 69 74 73 0a 20 20 20 20  qual to its.    
2e5f0 20 20 20 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65      ** most expe
2e600 6e 73 69 76 65 20 73 75 62 2d 73 63 61 6e 2e 20  nsive sub-scan. 
2e610 41 64 64 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  Add the smallest
2e620 20 70 6f 73 73 69 62 6c 65 20 70 65 6e 61 6c 74   possible penalt
2e630 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 65  y .        ** (e
2e640 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c  quivalent to mul
2e650 74 69 70 6c 79 69 6e 67 20 74 68 65 20 63 6f 73  tiplying the cos
2e660 74 20 62 79 20 31 2e 30 37 29 20 74 6f 20 65 6e  t by 1.07) to en
2e670 73 75 72 65 20 74 68 61 74 20 0a 20 20 20 20 20  sure that .     
2e680 20 20 20 2a 2a 20 74 68 69 73 20 64 6f 65 73 20     ** this does 
2e690 6e 6f 74 20 68 61 70 70 65 6e 2e 20 4f 74 68 65  not happen. Othe
2e6a0 72 77 69 73 65 2c 20 66 6f 72 20 57 48 45 52 45  rwise, for WHERE
2e6b0 20 63 6c 61 75 73 65 73 20 73 75 63 68 20 61 73   clauses such as
2e6c0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
2e6d0 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 65 72 65 20  following where 
2e6e0 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  there is an inde
2e6f0 78 20 6f 6e 20 22 79 22 3a 0a 20 20 20 20 20 20  x on "y":.      
2e700 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2e710 20 20 20 20 57 48 45 52 45 20 6c 69 6b 65 6c 69      WHERE likeli
2e720 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20  hood(x=?, 0.99) 
2e730 4f 52 20 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a  OR y=?.        *
2e740 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  *.        ** the
2e750 20 70 6c 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65   planner may ele
2e760 63 74 20 74 6f 20 22 4f 52 22 20 74 6f 67 65 74  ct to "OR" toget
2e770 68 65 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65  her a full-table
2e780 20 73 63 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20   scan and an.   
2e790 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f       ** index lo
2e7a0 6f 6b 75 70 2e 20 41 6e 64 20 6f 74 68 65 72 20  okup. And other 
2e7b0 73 69 6d 69 6c 61 72 6c 79 20 6f 64 64 20 72 65  similarly odd re
2e7c0 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20  sults.  */.     
2e7d0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
2e7e0 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b  sSum.a[i].rRun +
2e7f0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
2e800 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b  ->nOut = sSum.a[
2e810 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  i].nOut;.       
2e820 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
2e830 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71  sSum.a[i].prereq
2e840 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
2e850 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
2e860 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
2e870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48        }.      WH
2e880 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20  ERETRACE(0x200, 
2e890 28 22 45 6e 64 20 70 72 6f 63 65 73 73 69 6e 67  ("End processing
2e8a0 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22   OR-clause %p\n"
2e8b0 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d  , pTerm));.    }
2e8c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2e8d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
2e8e0 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
2e8f0 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62  ects for all tab
2e900 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  les .*/.static i
2e910 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41  nt whereLoopAddA
2e920 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  ll(WhereLoopBuil
2e930 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a  der *pBuilder){.
2e940 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2e950 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
2e960 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73  pWInfo;.  Bitmas
2e970 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  k mExtra = 0;.  
2e980 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d  Bitmask mPrior =
2e990 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a   0;.  int iTab;.
2e9a0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
2e9b0 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
2e9c0 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  abList;.  struct
2e9d0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2e9e0 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
2e9f0 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
2ea00 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
2ea10 6e 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  nTabList = pWInf
2ea20 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74  o->nLevel;.  int
2ea30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ea40 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 54  .  u8 priorJoinT
2ea50 79 70 65 20 3d 20 30 3b 0a 20 20 57 68 65 72 65  ype = 0;.  Where
2ea60 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f  Loop *pNew;..  /
2ea70 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  * Loop over the 
2ea80 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f  tables in the jo
2ea90 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  in, from left to
2eaa0 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77   right */.  pNew
2eab0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
2eac0 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  w;.  whereLoopIn
2ead0 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28  it(pNew);.  for(
2eae0 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54  iTab=0, pItem=pT
2eaf0 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c  abList->a; iTab<
2eb00 6e 54 61 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b  nTabList; iTab++
2eb10 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2eb20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61  pNew->iTab = iTa
2eb30 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73  b;.    pNew->mas
2eb40 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28  kSelf = getMask(
2eb50 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
2eb60 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  t, pItem->iCurso
2eb70 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49  r);.    if( ((pI
2eb80 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70 72  tem->jointype|pr
2eb90 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26 20 28  iorJoinType) & (
2eba0 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
2ebb0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ))!=0 ){.      m
2ebc0 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a  Extra = mPrior;.
2ebd0 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a      }.    priorJ
2ebe0 6f 69 6e 54 79 70 65 20 3d 20 70 49 74 65 6d 2d  oinType = pItem-
2ebf0 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 69  >jointype;.    i
2ec00 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74  f( IsVirtual(pIt
2ec10 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20  em->pTab) ){.   
2ec20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2ec30 70 41 64 64 56 69 72 74 75 61 6c 28 70 42 75 69  pAddVirtual(pBui
2ec40 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20  lder, mExtra);. 
2ec50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ec60 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2ec70 64 42 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c  dBtree(pBuilder,
2ec80 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a   mExtra);.    }.
2ec90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2eca0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2ecb0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2ecc0 4f 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78  Or(pBuilder, mEx
2ecd0 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
2ece0 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e  mPrior |= pNew->
2ecf0 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66  maskSelf;.    if
2ed00 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  ( rc || db->mall
2ed10 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b  ocFailed ) break
2ed20 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f  ;.  }.  whereLoo
2ed30 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65 77 29  pClear(db, pNew)
2ed40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2ed50 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20  ../*.** Examine 
2ed60 61 20 57 68 65 72 65 50 61 74 68 20 28 77 69 74  a WherePath (wit
2ed70 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f  h the addition o
2ed80 66 20 74 68 65 20 65 78 74 72 61 20 57 68 65 72  f the extra Wher
2ed90 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35 74 68  eLoop of the 5th
2eda0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29 20  .** parameters) 
2edb0 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75 74  to see if it out
2edc0 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68 65  puts rows in the
2edd0 20 72 65 71 75 65 73 74 65 64 20 4f 52 44 45 52   requested ORDER
2ede0 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50   BY.** (or GROUP
2edf0 20 42 59 29 20 77 69 74 68 6f 75 74 20 72 65 71   BY) without req
2ee00 75 69 72 69 6e 67 20 61 20 73 65 70 61 72 61 74  uiring a separat
2ee10 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e  e sort operation
2ee20 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a 2a 20  .  Return N:.** 
2ee30 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e 20 74  .**   N>0:   N t
2ee40 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
2ee50 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
2ee60 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e  satisfied.**   N
2ee70 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73 20 6f  ==0:  No terms o
2ee80 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
2ee90 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73 66  lause are satisf
2eea0 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20 20 20  ied.**   N<0:   
2eeb0 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f 77 20  Unknown yet how 
2eec0 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20 4f 52  many terms of OR
2eed0 44 45 52 20 42 59 20 6d 69 67 68 74 20 62 65 20  DER BY might be 
2eee0 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a 2a 2a  satisfied.   .**
2eef0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 72  .** Note that pr
2ef00 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 48 45  ocessing for WHE
2ef10 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64 20 57  RE_GROUPBY and W
2ef20 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
2ef30 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72  is not as.** str
2ef40 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f 55 50  ict.  With GROUP
2ef50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
2ef60 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72   the only requir
2ef70 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a  ement is that.**
2ef80 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73   equivalent rows
2ef90 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74   appear immediat
2efa0 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74 6f 20  ely adjacent to 
2efb0 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20 47 52  one another.  GR
2efc0 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49  OUP BY.** and DI
2efd0 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20 72 65  STINCT do not re
2efe0 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61 70  quire rows to ap
2eff0 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72 74  pear in any part
2f000 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73 20  icular order as 
2f010 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69 76  long.** as equiv
2f020 61 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20 67  alent rows are g
2f030 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e  rouped together.
2f040 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55 50    Thus for GROUP
2f050 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
2f060 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79  .** the pOrderBy
2f070 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d 61   terms can be ma
2f080 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72 64  tched in any ord
2f090 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52 20  er.  With ORDER 
2f0a0 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64  BY, the .** pOrd
2f0b0 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74 20  erBy terms must 
2f0c0 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73 74  be matched in st
2f0d0 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67  rict left-to-rig
2f0e0 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ht order..*/.sta
2f0f0 74 69 63 20 69 38 20 77 68 65 72 65 50 61 74 68  tic i8 wherePath
2f100 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
2f110 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
2f120 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65  WInfo,    /* The
2f130 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
2f140 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
2f150 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45  derBy,   /* ORDE
2f160 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
2f170 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61   or DISTINCT cla
2f180 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  use to check */.
2f190 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 50 61    WherePath *pPa
2f1a0 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  th,     /* The W
2f1b0 68 65 72 65 50 61 74 68 20 74 6f 20 63 68 65 63  herePath to chec
2f1c0 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  k */.  u16 wctrl
2f1d0 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20  Flags,       /* 
2f1e0 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 57 48  Might contain WH
2f1f0 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 57  ERE_GROUPBY or W
2f200 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
2f210 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20  */.  u16 nLoop, 
2f220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2f230 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
2f240 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  in pPath->aLoop[
2f250 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ] */.  WhereLoop
2f260 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20   *pLast,     /* 
2f270 41 64 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f  Add this WhereLo
2f280 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  op to the end of
2f290 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20   pPath->aLoop[] 
2f2a0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52  */.  Bitmask *pR
2f2b0 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55  evMask     /* OU
2f2c0 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65  T: Mask of Where
2f2d0 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20  Loops to run in 
2f2e0 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
2f2f0 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b  .){.  u8 revSet;
2f300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f310 72 75 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e  rue if rev is kn
2f320 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b  own */.  u8 rev;
2f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f340 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74  * Composite sort
2f350 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72   order */.  u8 r
2f360 65 76 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  evIdx;          
2f370 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20    /* Index sort 
2f380 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73  order */.  u8 is
2f390 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20  OrderDistinct;  
2f3a0 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68   /* All prior Wh
2f3b0 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64  ereLoops are ord
2f3c0 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  er-distinct */. 
2f3d0 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75   u8 distinctColu
2f3e0 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  mns;   /* True i
2f3f0 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55  f the loop has U
2f400 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63  NIQUE NOT NULL c
2f410 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69  olumns */.  u8 i
2f420 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  sMatch;         
2f430 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74    /* iColumn mat
2f440 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ches a term of t
2f450 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2f460 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79  se */.  u16 nKey
2f470 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Col;          /*
2f480 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 63   Number of key c
2f490 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78  olumns in pIndex
2f4a0 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d   */.  u16 nColum
2f4b0 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n;          /* T
2f4c0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f  otal number of o
2f4d0 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20 69  rdered columns i
2f4e0 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  n the index */. 
2f4f0 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20   u16 nOrderBy;  
2f500 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2f510 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
2f520 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
2f530 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20  .  int iLoop;   
2f540 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2f550 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69  x of WhereLoop i
2f560 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20 70 72  n pPath being pr
2f570 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ocessed */.  int
2f580 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
2f590 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2f5a0 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ers */.  int iCu
2f5b0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
2f5c0 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
2f5d0 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65 72  for current Wher
2f5e0 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69  eLoop */.  int i
2f5f0 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
2f600 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d   /* A column num
2f610 62 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65  ber within table
2f620 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65   iCur */.  Where
2f630 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b  Loop *pLoop = 0;
2f640 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72   /* Current Wher
2f650 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63  eLoop being proc
2f660 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72  essed. */.  Wher
2f670 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
2f680 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
2f690 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
2f6a0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
2f6b0 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20   *pOBExpr;      
2f6c0 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69    /* An expressi
2f6d0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45  on from the ORDE
2f6e0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
2f6f0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
2f700 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54         /* COLLAT
2f710 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20  E function from 
2f720 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
2f730 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64  se term */.  Ind
2f740 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
2f750 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
2f760 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2f770 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74  pLoop */.  sqlit
2f780 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
2f790 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a  >pParse->db;  /*
2f7a0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
2f7b0 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
2f7c0 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20  k obSat = 0;    
2f7d0 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52  /* Mask of ORDER
2f7e0 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66   BY terms satisf
2f7f0 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  ied so far */.  
2f800 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20  Bitmask obDone; 
2f810 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
2f820 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65   all ORDER BY te
2f830 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rms */.  Bitmask
2f840 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
2f850 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  sk;  /* Mask of 
2f860 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64  all well-ordered
2f870 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d   loops */.  Bitm
2f880 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20  ask ready;      
2f890 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
2f8a0 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a  of inner loops *
2f8b0 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20  /..  /*.  ** We 
2f8c0 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  say the WhereLoo
2f8d0 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69  p is "one-row" i
2f8e0 66 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e  f it generates n
2f8f0 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a  o more than one.
2f900 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70    ** row of outp
2f910 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70  ut.  A WhereLoop
2f920 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61   is one-row if a
2f930 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
2f940 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
2f950 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65  **  (a) All inde
2f960 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20  x columns match 
2f970 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d  with WHERE_COLUM
2f980 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20  N_EQ..  **  (b) 
2f990 54 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69  The index is uni
2f9a0 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65  que.  ** Any Whe
2f9b0 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57  reLoop with an W
2f9c0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63  HERE_COLUMN_EQ c
2f9d0 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65  onstraint on the
2f9e0 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f   rowid is one-ro
2f9f0 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e  w..  ** Every on
2fa00 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20  e-row WhereLoop 
2fa10 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48  will have the WH
2fa20 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73  ERE_ONEROW bit s
2fa30 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20  et in wsFlags.. 
2fa40 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20   **.  ** We say 
2fa50 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  the WhereLoop is
2fa60 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74   "order-distinct
2fa70 22 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20  " if the set of 
2fa80 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a  columns from.  *
2fa90 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70  * that WhereLoop
2faa0 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
2fab0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2fac0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 66   are different f
2fad0 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f  or every.  ** ro
2fae0 77 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f  w of the WhereLo
2faf0 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72  op.  Every one-r
2fb00 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ow WhereLoop is 
2fb10 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20  automatically.  
2fb20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  ** order-distinc
2fb30 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70  t.   A WhereLoop
2fb40 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c   that has no col
2fb50 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45  umns in the ORDE
2fb60 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a  R BY clause.  **
2fb70 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69   is not order-di
2fb80 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72  stinct. To be or
2fb90 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20  der-distinct is 
2fba0 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20 73 61  not quite the sa
2fbb0 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a  me as being.  **
2fbc0 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20   UNIQUE since a 
2fbd0 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72  UNIQUE column or
2fbe0 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20   index can have 
2fbf0 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68  multiple rows th
2fc00 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c  at .  ** are NUL
2fc10 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65  L and NULL value
2fc20 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  s are equivalent
2fc30 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   for the purpose
2fc40 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   of order-distin
2fc50 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f  ct..  ** To be o
2fc60 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74  rder-distinct, t
2fc70 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20  he columns must 
2fc80 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f  be UNIQUE and NO
2fc90 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a  T NULL..  **.  *
2fca0 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20  * The rowid for 
2fcb0 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79  a table is alway
2fcc0 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54  s UNIQUE and NOT
2fcd0 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65   NULL so wheneve
2fce0 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64  r the.  ** rowid
2fcf0 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20   appears in the 
2fd00 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
2fd10 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2fd20 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a  ng WhereLoop is.
2fd30 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
2fd40 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  ly order-distinc
2fd50 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72  t..  */..  asser
2fd60 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29  t( pOrderBy!=0 )
2fd70 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26  ;.  if( nLoop &&
2fd80 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
2fd90 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
2fda0 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29  _OrderByIdxJoin)
2fdb0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
2fdc0 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  nOrderBy = pOrde
2fdd0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65  rBy->nExpr;.  te
2fde0 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79  stcase( nOrderBy
2fdf0 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28  ==BMS-1 );.  if(
2fe00 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20   nOrderBy>BMS-1 
2fe10 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
2fe20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20  Cannot optimize 
2fe30 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44  overly large ORD
2fe40 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72  ER BYs */.  isOr
2fe50 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b  derDistinct = 1;
2fe60 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b  .  obDone = MASK
2fe70 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b  BIT(nOrderBy)-1;
2fe80 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  .  orderDistinct
2fe90 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64  Mask = 0;.  read
2fea0 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f  y = 0;.  for(iLo
2feb0 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73  op=0; isOrderDis
2fec0 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f  tinct && obSat<o
2fed0 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d  bDone && iLoop<=
2fee0 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
2fef0 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30  .    if( iLoop>0
2ff00 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f   ) ready |= pLoo
2ff10 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
2ff20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e   pLoop = iLoop<n
2ff30 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c  Loop ? pPath->aL
2ff40 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61  oop[iLoop] : pLa
2ff50 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f  st;.    if( pLoo
2ff60 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2ff70 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
2ff80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  ){.      if( pLo
2ff90 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64  op->u.vtab.isOrd
2ffa0 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d 20 6f  ered ) obSat = o
2ffb0 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72 65  bDone;.      bre
2ffc0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 43  ak;.    }.    iC
2ffd0 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ur = pWInfo->pTa
2ffe0 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e  bList->a[pLoop->
2fff0 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a  iTab].iCursor;..
30000 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20      /* Mark off 
30010 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74 65 72  any ORDER BY ter
30020 6d 20 58 20 74 68 61 74 20 69 73 20 61 20 63 6f  m X that is a co
30030 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
30040 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
30050 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72  current loop for
30060 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73 20   which there is 
30070 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
30080 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20  E.    ** clause 
30090 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53  of the form X IS
300a0 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61   NULL or X=? tha
300b0 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  t reference only
300c0 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f   outer.    ** lo
300d0 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ops..    */.    
300e0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
300f0 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
30100 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
30110 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
30120 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70  ue;.      pOBExp
30130 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
30140 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65  kipCollate(pOrde
30150 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
30160 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45  ;.      if( pOBE
30170 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
30180 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  MN ) continue;. 
30190 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
301a0 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29  ->iTable!=iCur )
301b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
301c0 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
301d0 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  m(&pWInfo->sWC, 
301e0 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69  iCur, pOBExpr->i
301f0 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20  Column,.        
30200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e                 ~
30210 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f  ready, WO_EQ|WO_
30220 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20  ISNULL, 0);.    
30230 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
30240 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
30250 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
30260 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30  erator&WO_EQ)!=0
30270 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f   && pOBExpr->iCo
30280 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
30290 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
302a0 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20  1, *z2;.        
302b0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
302c0 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
302d0 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65  o->pParse, pOrde
302e0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
302f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
30300 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
30310 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
30320 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c        z1 = pColl
30330 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
30340 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
30350 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
30360 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72  fo->pParse, pTer
30370 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
30380 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
30390 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
303a0 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a  tColl;.        z
303b0 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  2 = pColl->zName
303c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
303d0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c  lite3StrICmp(z1,
303e0 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e   z2)!=0 ) contin
303f0 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
30400 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
30410 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  IT(i);.    }..  
30420 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
30430 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
30440 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20  EROW)==0 ){.    
30450 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
30460 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
30470 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
30480 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ex = 0;.        
30490 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  nKeyCol = 0;.   
304a0 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31       nColumn = 1
304b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
304c0 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f  ( (pIndex = pLoo
304d0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
304e0 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d  x)==0 || pIndex-
304f0 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20  >bUnordered ){. 
30500 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
30510 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
30520 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20        nKeyCol = 
30530 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  pIndex->nKeyCol;
30540 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  .        nColumn
30550 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   = pIndex->nColu
30560 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mn;.        asse
30570 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65  rt( nColumn==nKe
30580 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f  yCol+1 || !HasRo
30590 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62  wid(pIndex->pTab
305a0 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  le) );.        a
305b0 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 61  ssert( pIndex->a
305c0 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d  iColumn[nColumn-
305d0 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21 48 61 73  1]==(-1) || !Has
305e0 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
305f0 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20  able));.        
30600 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
30610 3d 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  = IsUniqueIndex(
30620 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d  pIndex);.      }
30630 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20  ..      /* Loop 
30640 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75  through all colu
30650 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
30660 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20 74   and deal with t
30670 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a  he ones.      **
30680 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f   that are not co
30690 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20  nstrained by == 
306a0 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a  or IN..      */.
306b0 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 53        rev = revS
306c0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 69  et = 0;.      di
306d0 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20  stinctColumns = 
306e0 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  0;.      for(j=0
306f0 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  ; j<nColumn; j++
30700 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f  ){.        u8 bO
30710 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 74  nce;   /* True t
30720 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45 52 20  o run the ORDER 
30730 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a  BY search loop *
30740 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 6b  /..        /* Sk
30750 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49  ip over == and I
30760 53 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a  S NULL terms */.
30770 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c          if( j<pL
30780 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
30790 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 6f  .         && pLo
307a0 6f 70 2d 3e 6e 53 6b 69 70 3d 3d 30 0a 20 20 20  op->nSkip==0.   
307b0 20 20 20 20 20 20 26 26 20 28 28 69 20 3d 20 70        && ((i = p
307c0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d  Loop->aLTerm[j]-
307d0 3e 65 4f 70 65 72 61 74 6f 72 29 20 26 20 28 57  >eOperator) & (W
307e0 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29  O_EQ|WO_ISNULL))
307f0 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
30800 20 20 20 20 20 20 20 20 20 69 66 28 20 69 20 26           if( i &
30810 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
30820 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
30830 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
30840 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nct );.         
30850 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
30860 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
30870 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f    }.          co
30880 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20  ntinue;  .      
30890 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
308a0 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  Get the column n
308b0 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62  umber in the tab
308c0 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64  le (iColumn) and
308d0 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20   sort order.    
308e0 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20      ** (revIdx) 
308f0 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c  for the j-th col
30900 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
30910 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
30920 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20       if( pIndex 
30930 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  ){.          iCo
30940 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61  lumn = pIndex->a
30950 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
30960 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 70        revIdx = p
30970 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
30980 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r[j];.          
30990 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e  if( iColumn==pIn
309a0 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b  dex->pTable->iPK
309b0 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d  ey ) iColumn = -
309c0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
309d0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  {.          iCol
309e0 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
309f0 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a      revIdx = 0;.
30a00 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
30a10 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74     /* An unconst
30a20 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68  rained column th
30a30 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  at might be NULL
30a40 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
30a50 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72  .        ** Wher
30a60 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c  eLoop is not wel
30a70 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20  l-ordered.      
30a80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
30a90 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
30aa0 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 43 6f  .         && iCo
30ab0 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20  lumn>=0.        
30ac0 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e   && j>=pLoop->u.
30ad0 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
30ae0 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54     && pIndex->pT
30af0 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
30b00 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20  mn].notNull==0. 
30b10 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
30b20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
30b30 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
30b40 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   }..        /* F
30b50 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42 59  ind the ORDER BY
30b60 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65   term that corre
30b70 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d  sponds to the j-
30b80 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  th column.      
30b90 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65    ** of the inde
30ba0 78 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20  x and mark that 
30bb0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66  ORDER BY term of
30bc0 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  f .        */.  
30bd0 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b        bOnce = 1;
30be0 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68  .        isMatch
30bf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
30c00 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20  r(i=0; bOnce && 
30c10 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
30c20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
30c30 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
30c40 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
30c50 20 20 20 20 20 20 20 20 20 70 4f 42 45 78 70 72           pOBExpr
30c60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
30c70 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72  ipCollate(pOrder
30c80 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
30c90 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
30ca0 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20  ase( wctrlFlags 
30cb0 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  & WHERE_GROUPBY 
30cc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
30cd0 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67  tcase( wctrlFlag
30ce0 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
30cf0 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20  CTBY );.        
30d00 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
30d10 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55 50  s & (WHERE_GROUP
30d20 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43  BY|WHERE_DISTINC
30d30 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65  TBY))==0 ) bOnce
30d40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
30d50 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21  if( pOBExpr->op!
30d60 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e  =TK_COLUMN ) con
30d70 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
30d80 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54   if( pOBExpr->iT
30d90 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e  able!=iCur ) con
30da0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
30db0 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43   if( pOBExpr->iC
30dc0 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29  olumn!=iColumn )
30dd0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
30de0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
30df0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
30e00 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
30e10 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
30e20 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
30e30 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
30e40 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
30e50 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
30e60 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
30e70 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
30e80 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
30e90 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
30ea0 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  , pIndex->azColl
30eb0 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  [j])!=0 ) contin
30ec0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
30ed0 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74 63            isMatc
30ee0 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  h = 1;.         
30ef0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
30f00 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
30f10 4d 61 74 63 68 20 26 26 20 28 77 63 74 72 6c 46  Match && (wctrlF
30f20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f  lags & WHERE_GRO
30f30 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  UPBY)==0 ){.    
30f40 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
30f50 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65  re the sort orde
30f60 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20  r is compatible 
30f70 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  in an ORDER BY c
30f80 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20 20  lause..         
30f90 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69   ** Sort order i
30fa0 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72  s irrelevant for
30fb0 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
30fc0 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
30fd0 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20   if( revSet ){. 
30fe0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
30ff0 72 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70  rev ^ revIdx)!=p
31000 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
31010 72 74 4f 72 64 65 72 20 29 20 69 73 4d 61 74 63  rtOrder ) isMatc
31020 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  h = 0;.         
31030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31040 20 20 20 20 72 65 76 20 3d 20 72 65 76 49 64 78      rev = revIdx
31050 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   ^ pOrderBy->a[i
31060 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ].sortOrder;.   
31070 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
31080 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20   ) *pRevMask |= 
31090 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a  MASKBIT(iLoop);.
310a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 53              revS
310b0 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  et = 1;.        
310c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
310d0 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63        if( isMatc
310e0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  h ){.          i
310f0 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  f( iColumn<0 ){.
31100 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
31110 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f  case( distinctCo
31120 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20  lumns==0 );.    
31130 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74          distinct
31140 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20  Columns = 1;.   
31150 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31160 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
31170 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
31180 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
31190 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75   /* No match fou
311a0 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
311b0 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b  if( j==0 || j<nK
311c0 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  eyCol ){.       
311d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
311e0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d  sOrderDistinct!=
311f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
31200 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
31210 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
31220 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
31230 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
31240 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70     } /* end Loop
31250 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20   over all index 
31260 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
31270 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c   if( distinctCol
31280 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20  umns ){.        
31290 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65  testcase( isOrde
312a0 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a  rDistinct==0 );.
312b0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
312c0 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20  istinct = 1;.   
312d0 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e     }.    } /* en
312e0 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77  d-if not one-row
312f0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b   */..    /* Mark
31300 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f   off any other O
31310 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68  RDER BY terms th
31320 61 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f  at reference pLo
31330 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73  op */.    if( is
31340 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b  OrderDistinct ){
31350 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69 73 74  .      orderDist
31360 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f  inctMask |= pLoo
31370 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
31380 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
31390 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
313a0 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20        Expr *p;. 
313b0 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
313c0 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
313d0 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
313e0 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
313f0 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72  .        p = pOr
31400 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
31410 72 3b 0a 20 20 20 20 20 20 20 20 6d 54 65 72 6d  r;.        mTerm
31420 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
31430 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  e(&pWInfo->sMask
31440 53 65 74 2c 70 29 3b 0a 20 20 20 20 20 20 20 20  Set,p);.        
31450 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26 20  if( mTerm==0 && 
31460 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
31470 6e 73 74 61 6e 74 28 70 29 20 29 20 63 6f 6e 74  nstant(p) ) cont
31480 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
31490 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72 44  ( (mTerm&~orderD
314a0 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20  istinctMask)==0 
314b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53  ){.          obS
314c0 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
314d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
314e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a    }.    }.  } /*
314f0 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76   End the loop ov
31500 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  er all WhereLoop
31510 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73  s from outer-mos
31520 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d  t down to inner-
31530 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62  most */.  if( ob
31540 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65  Sat==obDone ) re
31550 74 75 72 6e 20 28 69 38 29 6e 4f 72 64 65 72 42  turn (i8)nOrderB
31560 79 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65  y;.  if( !isOrde
31570 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
31580 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42 79 2d   for(i=nOrderBy-
31590 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
315a0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
315b0 4d 41 53 4b 42 49 54 28 69 29 20 2d 20 31 3b 0a  MASKBIT(i) - 1;.
315c0 20 20 20 20 20 20 69 66 28 20 28 6f 62 53 61 74        if( (obSat
315d0 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72 6e 20  &m)==m ) return 
315e0 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  i;.    }.    ret
315f0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
31600 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn -1;.}.../*.*
31610 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 5f 47  * If the WHERE_G
31620 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73  ROUPBY flag is s
31630 65 74 20 69 6e 20 74 68 65 20 6d 61 73 6b 20 70  et in the mask p
31640 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
31650 57 68 65 72 65 42 65 67 69 6e 28 29 2c 0a 2a 2a  WhereBegin(),.**
31660 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 61 73 73   the planner ass
31670 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 73 70  umes that the sp
31680 65 63 69 66 69 65 64 20 70 4f 72 64 65 72 42 79  ecified pOrderBy
31690 20 6c 69 73 74 20 69 73 20 61 63 74 75 61 6c 6c   list is actuall
316a0 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42 59 20  y a GROUP.** BY 
316b0 63 6c 61 75 73 65 20 2d 20 61 6e 64 20 73 6f 20  clause - and so 
316c0 61 6e 79 20 6f 72 64 65 72 20 74 68 61 74 20 67  any order that g
316d0 72 6f 75 70 73 20 72 6f 77 73 20 61 73 20 72 65  roups rows as re
316e0 71 75 69 72 65 64 20 73 61 74 69 73 66 69 65 73  quired satisfies
316f0 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2e   the.** request.
31700 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
31710 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   in this case it
31720 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
31730 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20   for the caller 
31740 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  to determine.** 
31750 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
31760 68 65 20 72 6f 77 73 20 61 72 65 20 72 65 61 6c  he rows are real
31770 6c 79 20 62 65 69 6e 67 20 64 65 6c 69 76 65 72  ly being deliver
31780 65 64 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ed in sorted ord
31790 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74 20 69  er, or.** just i
317a0 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 72 64  n some other ord
317b0 65 72 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  er that provides
317c0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 67 72   the required gr
317d0 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c  ouping. However,
317e0 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45  .** if the WHERE
317f0 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 66 6c 61  _SORTBYGROUP fla
31800 67 20 69 73 20 61 6c 73 6f 20 70 61 73 73 65 64  g is also passed
31810 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
31820 42 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a  Begin(), then.**
31830 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
31840 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ay be called on 
31850 74 68 65 20 72 65 74 75 72 6e 65 64 20 57 68 65  the returned Whe
31860 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 49  reInfo object. I
31870 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72 75  t returns.** tru
31880 65 20 69 66 20 74 68 65 20 72 6f 77 73 20 72 65  e if the rows re
31890 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73 6f 72  ally will be sor
318a0 74 65 64 20 69 6e 20 74 68 65 20 73 70 65 63 69  ted in the speci
318b0 66 69 65 64 20 6f 72 64 65 72 2c 20 6f 72 20 66  fied order, or f
318c0 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73  alse.** otherwis
318d0 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  e..**.** For exa
318e0 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 3a 0a  mple, assuming:.
318f0 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  **.**   CREATE I
31900 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78 2c  NDEX i1 ON t1(x,
31910 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a   Y);.**.** then.
31920 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
31930 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42   FROM t1 GROUP B
31940 59 20 78 2c 79 20 4f 52 44 45 52 20 42 59 20 78  Y x,y ORDER BY x
31950 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65  ,y;   -- IsSorte
31960 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c 45  d()==1.**   SELE
31970 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f  CT * FROM t1 GRO
31980 55 50 20 42 59 20 79 2c 78 20 4f 52 44 45 52 20  UP BY y,x ORDER 
31990 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49 73 53  BY y,x;   -- IsS
319a0 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e  orted()==0.*/.in
319b0 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
319c0 53 6f 72 74 65 64 28 57 68 65 72 65 49 6e 66 6f  Sorted(WhereInfo
319d0 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73   *pWInfo){.  ass
319e0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74  ert( pWInfo->wct
319f0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
31a00 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 61 73 73  GROUPBY );.  ass
31a10 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74  ert( pWInfo->wct
31a20 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
31a30 53 4f 52 54 42 59 47 52 4f 55 50 20 29 3b 0a 20  SORTBYGROUP );. 
31a40 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
31a50 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66 64 65  sorted;.}..#ifde
31a60 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
31a70 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75  BLED./* For debu
31a80 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20  gging use only: 
31a90 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
31aa0 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e  char *wherePathN
31ab0 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a 70  ame(WherePath *p
31ac0 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c  Path, int nLoop,
31ad0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
31ae0 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  t){.  static cha
31af0 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69  r zName[65];.  i
31b00 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
31b10 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20   i<nLoop; i++){ 
31b20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68  zName[i] = pPath
31b30 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b  ->aLoop[i]->cId;
31b40 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29   }.  if( pLast )
31b50 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c   zName[i++] = pL
31b60 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d  ast->cId;.  zNam
31b70 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  e[i] = 0;.  retu
31b80 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64  rn zName;.}.#end
31b90 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
31ba0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72   the cost of sor
31bb0 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77 73 2c 20  ting nRow rows, 
31bc0 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68  assuming that th
31bd0 65 20 6b 65 79 73 20 68 61 76 65 20 0a 2a 2a 20  e keys have .** 
31be0 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75 6d 6e 73  nOrderby columns
31bf0 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 66 69   and that the fi
31c00 72 73 74 20 6e 53 6f 72 74 65 64 20 63 6f 6c 75  rst nSorted colu
31c10 6d 6e 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  mns are already 
31c20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a  in.** order..*/.
31c30 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68  static LogEst wh
31c40 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a  ereSortingCost(.
31c50 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
31c60 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74 20 6e 52  nfo,.  LogEst nR
31c70 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  ow,.  int nOrder
31c80 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f 72 74 65  By,.  int nSorte
31c90 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  d.){.  /* TUNING
31ca0 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74  : Estimated cost
31cb0 20 6f 66 20 61 20 66 75 6c 6c 20 65 78 74 65 72   of a full exter
31cc0 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65 72 65 20  nal sort, where 
31cd0 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68 65 20 6e  N is .  ** the n
31ce0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f  umber of rows to
31cf0 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a 2a 0a 20   sort is:.  **. 
31d00 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e   **   cost = (3.
31d10 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e  0 * N * log(N)).
31d20 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20  .  ** .  ** Or, 
31d30 69 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20  if the order-by 
31d40 63 6c 61 75 73 65 20 68 61 73 20 58 20 74 65 72  clause has X ter
31d50 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74 68 65 20  ms but only the 
31d60 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20 74 65 72  last Y .  ** ter
31d70 6d 73 20 61 72 65 20 6f 75 74 20 6f 66 20 6f 72  ms are out of or
31d80 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d  der, then block-
31d90 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72 65 64  sorting will red
31da0 75 63 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 6f  uce the .  ** so
31db0 72 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a 20  rting cost to:. 
31dc0 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20   **.  **   cost 
31dd0 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67  = (3.0 * N * log
31de0 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20 20 2a  (N)) * (Y/X).  *
31df0 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59 2f 58 29  *.  ** The (Y/X)
31e00 20 74 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d 65   term is impleme
31e10 6e 74 65 64 20 75 73 69 6e 67 20 73 74 61 63 6b  nted using stack
31e20 20 76 61 72 69 61 62 6c 65 20 72 53 63 61 6c 65   variable rScale
31e30 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f  .  ** below.  */
31e40 0a 20 20 4c 6f 67 45 73 74 20 72 53 63 61 6c 65  .  LogEst rScale
31e50 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 61  , rSortCost;.  a
31e60 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
31e70 30 20 26 26 20 36 36 3d 3d 73 71 6c 69 74 65 33  0 && 66==sqlite3
31e80 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20  LogEst(100) );. 
31e90 20 72 53 63 61 6c 65 20 3d 20 73 71 6c 69 74 65   rScale = sqlite
31ea0 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65 72 42  3LogEst((nOrderB
31eb0 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30 30 2f 6e  y-nSorted)*100/n
31ec0 4f 72 64 65 72 42 79 29 20 2d 20 36 36 3b 0a 20  OrderBy) - 66;. 
31ed0 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f   rSortCost = nRo
31ee0 77 20 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77 29  w + estLog(nRow)
31ef0 20 2b 20 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a   + rScale + 16;.
31f00 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 54 68  .  /* TUNING: Th
31f10 65 20 63 6f 73 74 20 6f 66 20 69 6d 70 6c 65 6d  e cost of implem
31f20 65 6e 74 69 6e 67 20 44 49 53 54 49 4e 43 54 20  enting DISTINCT 
31f30 75 73 69 6e 67 20 61 20 42 2d 54 52 45 45 20 69  using a B-TREE i
31f40 73 0a 20 20 2a 2a 20 73 69 6d 69 6c 61 72 20 62  s.  ** similar b
31f50 75 74 20 77 69 74 68 20 61 20 6c 61 72 67 65 72  ut with a larger
31f60 20 63 6f 6e 73 74 61 6e 74 20 6f 66 20 70 72 6f   constant of pro
31f70 70 6f 72 74 69 6f 6e 61 6c 69 74 79 2e 20 0a 20  portionality. . 
31f80 20 2a 2a 20 4d 75 6c 74 69 70 6c 79 20 62 79 20   ** Multiply by 
31f90 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 66 61  an additional fa
31fa0 63 74 6f 72 20 6f 66 20 33 2e 30 2e 20 20 2a 2f  ctor of 3.0.  */
31fb0 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77  .  if( pWInfo->w
31fc0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
31fd0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
31fe0 29 7b 0a 20 20 20 20 72 53 6f 72 74 43 6f 73 74  ){.    rSortCost
31ff0 20 2b 3d 20 31 36 3b 0a 20 20 7d 0a 0a 20 20 72   += 16;.  }..  r
32000 65 74 75 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b  eturn rSortCost;
32010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
32020 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72  the list of Wher
32030 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74  eLoop objects at
32040 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c   pWInfo->pLoops,
32050 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
32060 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e   attempts to fin
32070 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
32080 74 20 70 61 74 68 20 74 68 61 74 20 76 69 73 69  t path that visi
32090 74 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f  ts each WhereLoo
320a0 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73  p.** once.  This
320b0 20 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f   path is then lo
320c0 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57  aded into the pW
320d0 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70  Info->a[].pWLoop
320e0 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41   fields..**.** A
320f0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 74  ssume that the t
32100 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f  otal number of o
32110 75 74 70 75 74 20 72 6f 77 73 20 74 68 61 74 20  utput rows that 
32120 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
32130 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62  sorted.** will b
32140 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68  e nRowEst (in th
32150 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73  e 10*log2 repres
32160 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20  entation).  Or, 
32170 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a  ignore sorting.*
32180 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45  * costs if nRowE
32190 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  st==0..**.** Ret
321a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
321b0 20 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49   success or SQLI
321c0 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65  TE_NOMEM of a me
321d0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
321e0 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  ** error occurs.
321f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
32200 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57  herePathSolver(W
32210 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
32220 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74  , LogEst nRowEst
32230 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63  ){.  int mxChoic
32240 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
32250 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
32260 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73   of simultaneous
32270 20 70 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a   paths tracked *
32280 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20  /.  int nLoop;  
32290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
322a0 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
322b0 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   in the join */.
322c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
322d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
322e0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
322f0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
32300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32310 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
32320 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
32330 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t iLoop;        
32340 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
32350 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65  counter over the
32360 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f   terms of the jo
32370 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20  in */.  int ii, 
32380 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  jj;             
32390 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
323a0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20  rs */.  int mxI 
323b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
323c0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65    /* Index of ne
323d0 78 74 20 65 6e 74 72 79 20 74 6f 20 72 65 70 6c  xt entry to repl
323e0 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72  ace */.  int nOr
323f0 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20  derBy;          
32400 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
32410 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
32420 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  terms */.  LogEs
32430 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20  t mxCost = 0;   
32440 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
32450 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66  cost of a set of
32460 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45   paths */.  LogE
32470 73 74 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20  st mxUnsorted = 
32480 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  0;    /* Maximum
32490 20 75 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f   unsorted cost o
324a0 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 20  f a set of path 
324b0 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46  */.  int nTo, nF
324c0 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rom;           /
324d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  * Number of vali
324e0 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f  d entries in aTo
324f0 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a  [] and aFrom[] *
32500 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61  /.  WherePath *a
32510 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a  From;         /*
32520 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73   All nFrom paths
32530 20 61 74 20 74 68 65 20 70 72 65 76 69 6f 75 73   at the previous
32540 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72   level */.  Wher
32550 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20  ePath *aTo;     
32560 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f        /* The nTo
32570 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20 74   best paths at t
32580 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c  he current level
32590 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
325a0 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20  *pFrom;         
325b0 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  /* An element of
325c0 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65   aFrom[] that we
325d0 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
325e0 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
325f0 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  pTo;           /
32600 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  * An element of 
32610 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72  aTo[] that we ar
32620 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
32630 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c    WhereLoop *pWL
32640 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  oop;        /* O
32650 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ne of the WhereL
32660 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  oop objects */. 
32670 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b   WhereLoop **pX;
32680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
32690 65 64 20 74 6f 20 64 69 76 79 20 75 70 20 74 68  ed to divy up th
326a0 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20  e pSpace memory 
326b0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f  */.  LogEst *aSo
326c0 72 74 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f  rtCost = 0;    /
326d0 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64 20 70 61  * Sorting and pa
326e0 72 74 69 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f  rtial sorting co
326f0 73 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  sts */.  char *p
32700 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
32710 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
32720 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
32730 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  his routine */. 
32740 20 69 6e 74 20 6e 53 70 61 63 65 3b 20 20 20 20   int nSpace;    
32750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
32760 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  tes of space all
32770 6f 63 61 74 65 64 20 61 74 20 70 53 70 61 63 65  ocated at pSpace
32780 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
32790 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
327a0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
327b0 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49  b;.  nLoop = pWI
327c0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f  nfo->nLevel;.  /
327d0 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69  * TUNING: For si
327e0 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e  mple queries, on
327f0 6c 79 20 74 68 65 20 62 65 73 74 20 70 61 74 68  ly the best path
32800 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a   is tracked..  *
32810 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e  * For 2-way join
32820 73 2c 20 74 68 65 20 35 20 62 65 73 74 20 70 61  s, the 5 best pa
32830 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64  ths are followed
32840 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73  ..  ** For joins
32850 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61   of 3 or more ta
32860 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20  bles, track the 
32870 31 30 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f  10 best paths */
32880 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e  .  mxChoice = (n
32890 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28  Loop<=1) ? 1 : (
328a0 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31  nLoop==2 ? 5 : 1
328b0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c  0);.  assert( nL
328c0 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61  oop<=pWInfo->pTa
328d0 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
328e0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30   WHERETRACE(0x00
328f0 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20  2, ("---- begin 
32900 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f 77 45 73  solver.  (nRowEs
32910 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73  t=%d)\n", nRowEs
32920 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52  t));..  /* If nR
32930 6f 77 45 73 74 20 69 73 20 7a 65 72 6f 20 61 6e  owEst is zero an
32940 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  d there is an OR
32950 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69  DER BY clause, i
32960 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20 74 68 69  gnore it. In thi
32970 73 0a 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20  s.  ** case the 
32980 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20  purpose of this 
32990 63 61 6c 6c 20 69 73 20 74 6f 20 65 73 74 69 6d  call is to estim
329a0 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
329b0 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 0a  f rows returned.
329c0 20 20 2a 2a 20 62 79 20 74 68 65 20 6f 76 65 72    ** by the over
329d0 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e 63 65 20  all query. Once 
329e0 74 68 69 73 20 65 73 74 69 6d 61 74 65 20 68 61  this estimate ha
329f0 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c  s been obtained,
32a00 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a   the caller.  **
32a10 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69   will invoke thi
32a20 73 20 66 75 6e 63 74 69 6f 6e 20 61 20 73 65 63  s function a sec
32a30 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73 73 69 6e  ond time, passin
32a40 67 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 61  g the estimate a
32a50 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45  s the.  ** nRowE
32a60 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20 20 2a  st parameter.  *
32a70 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  /.  if( pWInfo->
32a80 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e  pOrderBy==0 || n
32a90 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20  RowEst==0 ){.   
32aa0 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   nOrderBy = 0;. 
32ab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64   }else{.    nOrd
32ac0 65 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  erBy = pWInfo->p
32ad0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
32ae0 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
32af0 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
32b00 65 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f 2c  e space for aTo,
32b10 20 61 46 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74   aFrom and aSort
32b20 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61  Cost[] */.  nSpa
32b30 63 65 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65  ce = (sizeof(Whe
32b40 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57  rePath)+sizeof(W
32b50 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70  hereLoop*)*nLoop
32b60 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20  )*mxChoice*2;.  
32b70 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66  nSpace += sizeof
32b80 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65  (LogEst) * nOrde
32b90 72 42 79 3b 0a 20 20 70 53 70 61 63 65 20 3d 20  rBy;.  pSpace = 
32ba0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
32bb0 61 77 28 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a  aw(db, nSpace);.
32bc0 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20    if( pSpace==0 
32bd0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
32be0 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28  NOMEM;.  aTo = (
32bf0 57 68 65 72 65 50 61 74 68 2a 29 70 53 70 61 63  WherePath*)pSpac
32c00 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f  e;.  aFrom = aTo
32c10 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d  +mxChoice;.  mem
32c20 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69  set(aFrom, 0, si
32c30 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b  zeof(aFrom[0]));
32c40 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f  .  pX = (WhereLo
32c50 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68  op**)(aFrom+mxCh
32c60 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d  oice);.  for(ii=
32c70 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f  mxChoice*2, pFro
32c80 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d  m=aTo; ii>0; ii-
32c90 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b  -, pFrom++, pX +
32ca0 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46  = nLoop){.    pF
32cb0 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b  rom->aLoop = pX;
32cc0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65  .  }.  if( nOrde
32cd0 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  rBy ){.    /* If
32ce0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
32cf0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
32d00 20 69 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67   it is not being
32d10 20 69 67 6e 6f 72 65 64 2c 20 73 65 74 20 75 70   ignored, set up
32d20 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 66 6f  .    ** space fo
32d30 72 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 5b  r the aSortCost[
32d40 5d 20 61 72 72 61 79 2e 20 45 61 63 68 20 65 6c  ] array. Each el
32d50 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 53 6f  ement of the aSo
32d60 72 74 43 6f 73 74 20 61 72 72 61 79 0a 20 20 20  rtCost array.   
32d70 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 7a 65   ** is either ze
32d80 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20  ro - meaning it 
32d90 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
32da0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f   initialized - o
32db0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73  r the.    ** cos
32dc0 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f  t of sorting nRo
32dd0 77 45 73 74 20 72 6f 77 73 20 6f 66 20 64 61 74  wEst rows of dat
32de0 61 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73  a where the firs
32df0 74 20 58 20 74 65 72 6d 73 20 6f 66 0a 20 20 20  t X terms of.   
32e00 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
32e10 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 72 65   clause are alre
32e20 61 64 79 20 69 6e 20 6f 72 64 65 72 2c 20 77 68  ady in order, wh
32e30 65 72 65 20 58 20 69 73 20 74 68 65 20 61 72 72  ere X is the arr
32e40 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  ay .    ** index
32e50 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43  .  */.    aSortC
32e60 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70  ost = (LogEst*)p
32e70 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 53  X;.    memset(aS
32e80 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65  ortCost, 0, size
32e90 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72  of(LogEst) * nOr
32ea0 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73  derBy);.  }.  as
32eb0 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 3d  sert( aSortCost=
32ec0 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53  =0 || &pSpace[nS
32ed0 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61  pace]==(char*)&a
32ee0 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42  SortCost[nOrderB
32ef0 79 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  y] );.  assert( 
32f00 61 53 6f 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20  aSortCost!=0 || 
32f10 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d  &pSpace[nSpace]=
32f20 3d 28 63 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20  =(char*)pX );.. 
32f30 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61   /* Seed the sea
32f40 72 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c  rch with a singl
32f50 65 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74  e WherePath cont
32f60 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72  aining zero Wher
32f70 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  eLoops..  **.  *
32f80 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74  * TUNING: Do not
32f90 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   let the number 
32fa0 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f  of iterations go
32fb0 20 61 62 6f 76 65 20 32 35 2e 20 20 49 66 20 74   above 25.  If t
32fc0 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20  he cost.  ** of 
32fd0 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74  computing an aut
32fe0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20  omatic index is 
32ff0 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69  not paid back wi
33000 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32  thin the first 2
33010 35 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65  5.  ** rows, the
33020 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65  n do not use the
33030 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
33040 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e  . */.  aFrom[0].
33050 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73  nRow = MIN(pPars
33060 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34  e->nQueryLoop, 4
33070 36 29 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d  6);  assert( 46=
33080 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
33090 35 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20  5) );.  nFrom = 
330a0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 61 46 72  1;.  assert( aFr
330b0 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d  om[0].isOrdered=
330c0 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64  =0 );.  if( nOrd
330d0 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49  erBy ){.    /* I
330e0 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c  f nLoop is zero,
330f0 20 74 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   then there are 
33100 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e  no FROM terms in
33110 20 74 68 65 20 71 75 65 72 79 2e 20 53 69 6e 63   the query. Sinc
33120 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73  e.    ** in this
33130 20 63 61 73 65 20 74 68 65 20 71 75 65 72 79 20   case the query 
33140 6d 61 79 20 72 65 74 75 72 6e 20 61 20 6d 61 78  may return a max
33150 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c  imum of one row,
33160 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
33170 20 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20   ** are already 
33180 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
33190 20 6f 72 64 65 72 2e 20 53 65 74 20 69 73 4f 72   order. Set isOr
331a0 64 65 72 65 64 20 74 6f 20 6e 4f 72 64 65 72 42  dered to nOrderB
331b0 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69  y to.    ** indi
331c0 63 61 74 65 20 74 68 69 73 2e 20 4f 72 2c 20 69  cate this. Or, i
331d0 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72 65 61 74  f nLoop is great
331e0 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65  er than zero, se
331f0 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f 0a 20  t isOrdered to. 
33200 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61     ** -1, indica
33210 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 72 65  ting that the re
33220 73 75 6c 74 20 73 65 74 20 6d 61 79 20 6f 72 20  sult set may or 
33230 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72 64 65 72  may not be order
33240 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64 65 70 65  ed, .    ** depe
33250 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f  nding on the loo
33260 70 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ps added to the 
33270 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a  current plan.  *
33280 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69  /.    aFrom[0].i
33290 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70  sOrdered = nLoop
332a0 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72  >0 ? -1 : nOrder
332b0 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  By;.  }..  /* Co
332c0 6d 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65  mpute successive
332d0 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50  ly longer WhereP
332e0 61 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70  aths using the p
332f0 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69  revious generati
33300 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65  on.  ** of Where
33310 50 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73  Paths as the bas
33320 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e  is for the next.
33330 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20    Keep track of 
33340 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a  the mxChoice.  *
33350 2a 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  * best paths at 
33360 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20  each generation 
33370 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  */.  for(iLoop=0
33380 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69  ; iLoop<nLoop; i
33390 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f  Loop++){.    nTo
333a0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69   = 0;.    for(ii
333b0 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b  =0, pFrom=aFrom;
333c0 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c   ii<nFrom; ii++,
333d0 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
333e0 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e   for(pWLoop=pWIn
333f0 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f  fo->pLoops; pWLo
33400 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f  op; pWLoop=pWLoo
33410 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
33420 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f         LogEst nO
33430 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
33440 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73           /* Rows
33450 20 76 69 73 69 74 65 64 20 62 79 20 28 70 46 72   visited by (pFr
33460 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
33470 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f        LogEst rCo
33480 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
33490 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
334a0 6f 66 20 70 61 74 68 20 28 70 46 72 6f 6d 2b 70  of path (pFrom+p
334b0 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
334c0 20 20 4c 6f 67 45 73 74 20 72 55 6e 73 6f 72 74    LogEst rUnsort
334d0 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
334e0 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20      /* Unsorted 
334f0 63 6f 73 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70  cost of (pFrom+p
33500 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
33510 20 20 69 38 20 69 73 4f 72 64 65 72 65 64 20 3d    i8 isOrdered =
33520 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
33530 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65 72 65 64  d;  /* isOrdered
33540 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f   for (pFrom+pWLo
33550 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42  op) */.        B
33560 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20  itmask maskNew; 
33570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33580 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 72 63 20   /* Mask of src 
33590 76 69 73 69 74 65 64 20 62 79 20 28 2e 2e 29 20  visited by (..) 
335a0 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  */.        Bitma
335b0 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20  sk revMask = 0; 
335c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
335d0 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65  Mask of rev-orde
335e0 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29  r loops for (..)
335f0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 28   */..        if(
33600 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   (pWLoop->prereq
33610 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c   & ~pFrom->maskL
33620 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  oop)!=0 ) contin
33630 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
33640 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  (pWLoop->maskSel
33650 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  f & pFrom->maskL
33660 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  oop)!=0 ) contin
33670 75 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  ue;.        /* A
33680 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 57  t this point, pW
33690 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69 64  Loop is a candid
336a0 61 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e 65  ate to be the ne
336b0 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20  xt loop. .      
336c0 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74 73    ** Compute its
336d0 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20 20   cost */.       
336e0 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c   rUnsorted = sql
336f0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 57  ite3LogEstAdd(pW
33700 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c  Loop->rSetup,pWL
33710 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f  oop->rRun + pFro
33720 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20  m->nRow);.      
33730 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71    rUnsorted = sq
33740 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72  lite3LogEstAdd(r
33750 55 6e 73 6f 72 74 65 64 2c 20 70 46 72 6f 6d 2d  Unsorted, pFrom-
33760 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a 20 20 20  >rUnsorted);.   
33770 20 20 20 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f       nOut = pFro
33780 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70  m->nRow + pWLoop
33790 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  ->nOut;.        
337a0 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d  maskNew = pFrom-
337b0 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f  >maskLoop | pWLo
337c0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
337d0 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
337e0 72 65 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  red<0 ){.       
337f0 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 77     isOrdered = w
33800 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
33810 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
33820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33830 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
33840 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c  pOrderBy, pFrom,
33850 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
33860 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ags,.           
33870 20 20 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f              iLoo
33880 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d  p, pWLoop, &revM
33890 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ask);.        }e
338a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
338b0 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
338c0 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  revLoop;.       
338d0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
338e0 73 4f 72 64 65 72 65 64 3e 3d 30 20 26 26 20 69  sOrdered>=0 && i
338f0 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64 65 72 42  sOrdered<nOrderB
33900 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  y ){.          i
33910 66 28 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f  f( aSortCost[isO
33920 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b 0a 20 20  rdered]==0 ){.  
33930 20 20 20 20 20 20 20 20 20 20 61 53 6f 72 74 43            aSortC
33940 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 20 3d  ost[isOrdered] =
33950 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73   whereSortingCos
33960 74 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t(.             
33970 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52 6f 77 45     pWInfo, nRowE
33980 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 20 69 73  st, nOrderBy, is
33990 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20  Ordered.        
339a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
339b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f   }.          rCo
339c0 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
339d0 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c  stAdd(rUnsorted,
339e0 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64   aSortCost[isOrd
339f0 65 72 65 64 5d 29 3b 0a 0a 20 20 20 20 20 20 20  ered]);..       
33a00 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
33a10 30 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20  002,.           
33a20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63     ("---- sort c
33a30 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64 29  ost=%-3d (%d/%d)
33a40 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20   increases cost 
33a50 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a  %3d to %-3d\n",.
33a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
33a70 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72  SortCost[isOrder
33a80 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d 69  ed], (nOrderBy-i
33a90 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72 64 65  sOrdered), nOrde
33aa0 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rBy, .          
33ab0 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 2c 20       rUnsorted, 
33ac0 72 43 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 20  rCost));.       
33ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33ae0 20 20 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f 72    rCost = rUnsor
33af0 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ted;.        }..
33b00 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
33b10 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f 6f   to see if pWLoo
33b20 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64 65  p should be adde
33b30 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 0a  d to the set of.
33b40 20 20 20 20 20 20 20 20 2a 2a 20 6d 78 43 68 6f          ** mxCho
33b50 69 63 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  ice best-so-far 
33b60 70 61 74 68 73 2e 0a 20 20 20 20 20 20 20 20 2a  paths..        *
33b70 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 69 72  *.        ** Fir
33b80 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65  st look for an e
33b90 78 69 73 74 69 6e 67 20 70 61 74 68 20 61 6d 6f  xisting path amo
33ba0 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  ng best-so-far p
33bb0 61 74 68 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  aths.        ** 
33bc0 74 68 61 74 20 63 6f 76 65 72 73 20 74 68 65 20  that covers the 
33bd0 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70  same set of loop
33be0 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61  s and has the sa
33bf0 6d 65 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20  me isOrdered.   
33c00 20 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20       ** setting 
33c10 61 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  as the current p
33c20 61 74 68 20 63 61 6e 64 69 64 61 74 65 2e 0a 20  ath candidate.. 
33c30 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
33c40 20 20 2a 2a 20 54 68 65 20 74 65 72 6d 20 22 28    ** The term "(
33c50 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e  (pTo->isOrdered^
33c60 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29  isOrdered)&0x80)
33c70 3d 3d 30 22 20 69 73 20 65 71 75 69 76 61 6c 65  ==0" is equivale
33c80 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  nt.        ** to
33c90 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64   (pTo->isOrdered
33ca0 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64 65  ==(-1))==(isOrde
33cb0 72 65 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72 20  red==(-1))" for 
33cc0 74 68 65 20 72 61 6e 67 65 0a 20 20 20 20 20 20  the range.      
33cd0 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76 61    ** of legal va
33ce0 6c 75 65 73 20 66 6f 72 20 69 73 4f 72 64 65 72  lues for isOrder
33cf0 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20 20  ed, -1..64..    
33d00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66      */.        f
33d10 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f  or(jj=0, pTo=aTo
33d20 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20  ; jj<nTo; jj++, 
33d30 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
33d40 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c    if( pTo->maskL
33d50 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20  oop==maskNew.   
33d60 20 20 20 20 20 20 20 20 26 26 20 28 28 70 54 6f          && ((pTo
33d70 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72  ->isOrdered^isOr
33d80 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30 0a  dered)&0x80)==0.
33d90 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
33da0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
33db0 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a  e( jj==nTo-1 );.
33dc0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
33dd0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
33de0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33df0 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a   if( jj>=nTo ){.
33e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e            /* Non
33e10 65 20 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e  e of the existin
33e20 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61  g best-so-far pa
33e30 74 68 73 20 6d 61 74 63 68 20 74 68 65 20 63 61  ths match the ca
33e40 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20 20  ndidate. */.    
33e50 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d        if( nTo>=m
33e60 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20  xChoice.        
33e70 20 20 20 26 26 20 28 72 43 6f 73 74 3e 6d 78 43     && (rCost>mxC
33e80 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d  ost || (rCost==m
33e90 78 43 6f 73 74 20 26 26 20 72 55 6e 73 6f 72 74  xCost && rUnsort
33ea0 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29 29  ed>=mxUnsorted))
33eb0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
33ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
33ed0 20 63 75 72 72 65 6e 74 20 63 61 6e 64 69 64 61   current candida
33ee0 74 65 20 69 73 20 6e 6f 20 62 65 74 74 65 72 20  te is no better 
33ef0 74 68 61 6e 20 61 6e 79 20 6f 66 20 74 68 65 20  than any of the 
33f00 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20  mxChoice.       
33f10 20 20 20 20 20 2a 2a 20 70 61 74 68 73 20 63 75       ** paths cu
33f20 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 62  rrently in the b
33f30 65 73 74 2d 73 6f 2d 66 61 72 20 62 75 66 66 65  est-so-far buffe
33f40 72 2e 20 20 53 6f 20 64 69 73 63 61 72 64 0a 20  r.  So discard. 
33f50 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
33f60 69 73 20 63 61 6e 64 69 64 61 74 65 20 61 73 20  is candidate as 
33f70 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a 23  not viable. */.#
33f80 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
33f90 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
33fa0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
33fb0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
33fc0 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
33fd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
33fe0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b  3DebugPrintf("Sk
33ff0 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  ip   %s cost=%-3
34000 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
34010 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
34020 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
34030 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
34040 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
34050 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
34060 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
34070 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
34080 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
34090 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
340a0 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  if.            c
340b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
340c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
340d0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
340e0 69 73 20 70 6f 69 6e 74 73 20 69 74 20 6d 65 61  is points it mea
340f0 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ns that the new 
34100 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 0a 20  candidate path. 
34110 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64           ** need
34120 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  s to be added to
34130 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74   the set of best
34140 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 20 2a  -so-far paths. *
34150 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
34160 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a  nTo<mxChoice ){.
34170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
34180 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
34190 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20   of the aTo set 
341a0 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  by one */.      
341b0 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b        jj = nTo++
341c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
341d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
341e0 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61  * New path repla
341f0 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f  ces the prior wo
34200 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e  rst to keep coun
34210 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65  t below mxChoice
34220 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
34230 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20  jj = mxI;.      
34240 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
34250 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a  pTo = &aTo[jj];.
34260 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
34270 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
34280 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
34290 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
342a0 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
342b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
342c0 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20  bugPrintf("New  
342d0 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
342e0 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
342f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34300 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
34310 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
34320 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
34330 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
34340 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
34350 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
34360 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
34370 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
34380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34390 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65     /* Control re
343a0 61 63 68 65 73 20 68 65 72 65 20 69 66 20 62 65  aches here if be
343b0 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 20 70  st-so-far path p
343c0 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72  To=aTo[jj] cover
343d0 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
343e0 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c  ** same set of l
343f0 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65  oops and has the
34400 20 73 61 6d 20 69 73 4f 72 64 65 72 65 64 20 73   sam isOrdered s
34410 65 74 74 69 6e 67 20 61 73 20 74 68 65 0a 20 20  etting as the.  
34420 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 64 69          ** candi
34430 64 61 74 65 20 70 61 74 68 2e 20 20 43 68 65 63  date path.  Chec
34440 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
34450 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64  candidate should
34460 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20 20   replace.       
34470 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66 20     ** pTo or if 
34480 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68  the candidate sh
34490 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64 20  ould be skipped 
344a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
344b0 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72 43 6f 73   pTo->rCost<rCos
344c0 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74  t || (pTo->rCost
344d0 3d 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e  ==rCost && pTo->
344e0 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20 29 7b 0a 23  nRow<=nOut) ){.#
344f0 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
34500 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
34510 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
34520 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
34530 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
34540 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
34550 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
34560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34570 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
34580 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
34590 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  c",.            
345a0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
345b0 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
345c0 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
345d0 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
345e0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
345f0 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
34600 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
34610 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
34620 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
34630 22 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25  "   vs %s cost=%
34640 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d 25 63 5c  -3d,%d order=%c\
34650 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
34660 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
34670 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
34680 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
34690 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
346a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
346b0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30  To->isOrdered>=0
346c0 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65   ? pTo->isOrdere
346d0 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
346e0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
346f0 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  if.            /
34700 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61  * Discard the ca
34710 6e 64 69 64 61 74 65 20 70 61 74 68 20 66 72 6f  ndidate path fro
34720 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73 69 64  m further consid
34730 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  eration */.     
34740 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
34750 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f   pTo->rCost==rCo
34760 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  st );.          
34770 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
34780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34790 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d    testcase( pTo-
347a0 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20  >rCost==rCost+1 
347b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
347c0 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20  Control reaches 
347d0 68 65 72 65 20 69 66 20 74 68 65 20 63 61 6e 64  here if the cand
347e0 69 64 61 74 65 20 70 61 74 68 20 69 73 20 62 65  idate path is be
347f0 74 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  tter than the.  
34800 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 70          ** pTo p
34810 61 74 68 2e 20 20 52 65 70 6c 61 63 65 20 70 54  ath.  Replace pT
34820 6f 20 77 69 74 68 20 74 68 65 20 63 61 6e 64 69  o with the candi
34830 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20  date. */.#ifdef 
34840 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
34850 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
34860 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
34870 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
34880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
34890 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
348a0 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
348b0 20 20 20 20 22 55 70 64 61 74 65 20 25 73 20 63      "Update %s c
348c0 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
348d0 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
348e0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
348f0 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
34900 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
34910 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
34920 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
34930 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
34940 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
34950 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
34960 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
34970 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d 33   was %s cost=%-3
34980 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
34990 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
349a0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
349b0 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
349c0 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
349d0 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
349e0 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
349f0 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54  sOrdered>=0 ? pT
34a00 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27  o->isOrdered+'0'
34a10 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
34a20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
34a30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
34a40 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e   pWLoop is a win
34a50 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20  ner.  Add it to 
34a60 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 20  the set of best 
34a70 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
34a80 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20    pTo->maskLoop 
34a90 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
34aa0 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
34ab0 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54  Self;.        pT
34ac0 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76  o->revLoop = rev
34ad0 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  Mask;.        pT
34ae0 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a  o->nRow = nOut;.
34af0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f          pTo->rCo
34b00 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20  st = rCost;.    
34b10 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74      pTo->rUnsort
34b20 65 64 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a  ed = rUnsorted;.
34b30 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
34b40 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72  rdered = isOrder
34b50 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ed;.        memc
34b60 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70  py(pTo->aLoop, p
34b70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a  From->aLoop, siz
34b80 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a  eof(WhereLoop*)*
34b90 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
34ba0 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  pTo->aLoop[iLoop
34bb0 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  ] = pWLoop;.    
34bc0 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43      if( nTo>=mxC
34bd0 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20  hoice ){.       
34be0 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20     mxI = 0;.    
34bf0 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61        mxCost = a
34c00 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20  To[0].rCost;.   
34c10 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65         mxUnsorte
34c20 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b  d = aTo[0].nRow;
34c30 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
34c40 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d  j=1, pTo=&aTo[1]
34c50 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a  ; jj<mxChoice; j
34c60 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  j++, pTo++){.   
34c70 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
34c80 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 0a  ->rCost>mxCost .
34c90 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
34ca0 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43  (pTo->rCost==mxC
34cb0 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73  ost && pTo->rUns
34cc0 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72 74 65 64  orted>mxUnsorted
34cd0 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  ) .            )
34ce0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
34cf0 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43  mxCost = pTo->rC
34d00 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ost;.           
34d10 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20     mxUnsorted = 
34d20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3b 0a  pTo->rUnsorted;.
34d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
34d40 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20  I = jj;.        
34d50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
34d60 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
34d70 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65    }.    }..#ifde
34d80 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
34d90 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a  BLED  /* >=2 */.
34da0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
34db0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 30 32  hereTrace & 0x02
34dc0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
34dd0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d  3DebugPrintf("--
34de0 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25  -- after round %
34df0 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70  d ----\n", iLoop
34e00 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
34e10 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e  0, pTo=aTo; ii<n
34e20 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29  To; ii++, pTo++)
34e30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
34e40 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
34e50 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77  s cost=%-3d nrow
34e60 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  =%-3d order=%c",
34e70 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72  .           wher
34e80 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
34e90 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
34ea0 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
34eb0 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  w,.           pT
34ec0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  o->isOrdered>=0 
34ed0 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  ? (pTo->isOrdere
34ee0 64 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a 20  d+'0') : '?');. 
34ef0 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
34f00 69 73 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a 20  isOrdered>0 ){. 
34f10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
34f20 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65  DebugPrintf(" re
34f30 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f  v=0x%llx\n", pTo
34f40 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20  ->revLoop);.    
34f50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34f60 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
34f70 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
34f80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34f90 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
34fa0 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72     /* Swap the r
34fb0 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e  oles of aFrom an
34fc0 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65  d aTo for the ne
34fd0 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  xt generation */
34fe0 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f  .    pFrom = aTo
34ff0 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f  ;.    aTo = aFro
35000 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70  m;.    aFrom = p
35010 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20  From;.    nFrom 
35020 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66  = nTo;.  }..  if
35030 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20  ( nFrom==0 ){.  
35040 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
35050 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75  g(pParse, "no qu
35060 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a  ery solution");.
35070 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
35080 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20  e(db, pSpace);. 
35090 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
350a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20  _ERROR;.  }.  . 
350b0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77   /* Find the low
350c0 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20  est cost path.  
350d0 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65  pFrom will be le
350e0 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
350f0 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46  hat path */.  pF
35100 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66  rom = aFrom;.  f
35110 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f  or(ii=1; ii<nFro
35120 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  m; ii++){.    if
35130 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61  ( pFrom->rCost>a
35140 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29  From[ii].rCost )
35150 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b   pFrom = &aFrom[
35160 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ii];.  }.  asser
35170 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  t( pWInfo->nLeve
35180 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a  l==nLoop );.  /*
35190 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74   Load the lowest
351a0 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20   cost path into 
351b0 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28  pWInfo */.  for(
351c0 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e  iLoop=0; iLoop<n
351d0 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
351e0 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a      WhereLevel *
351f0 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d  pLevel = pWInfo-
35200 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20  >a + iLoop;.    
35210 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d  pLevel->pWLoop =
35220 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d   pWLoop = pFrom-
35230 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20  >aLoop[iLoop];. 
35240 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d     pLevel->iFrom
35250 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b   = pWLoop->iTab;
35260 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61  .    pLevel->iTa
35270 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  bCur = pWInfo->p
35280 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
35290 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f  l->iFrom].iCurso
352a0 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57  r;.  }.  if( (pW
352b0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
352c0 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
352d0 53 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26  STINCT)!=0.   &&
352e0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
352f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
35300 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26  TINCTBY)==0.   &
35310 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  & pWInfo->eDisti
35320 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  nct==WHERE_DISTI
35330 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e  NCT_NOOP.   && n
35340 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20  RowEst.  ){.    
35350 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b  Bitmask notUsed;
35360 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68  .    int rc = wh
35370 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
35380 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20  OrderBy(pWInfo, 
35390 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
353a0 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20  et, pFrom,.     
353b0 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
353c0 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c  E_DISTINCTBY, nL
353d0 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c  oop-1, pFrom->aL
353e0 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e  oop[nLoop-1], &n
353f0 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28  otUsed);.    if(
35400 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52 65   rc==pWInfo->pRe
35410 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20 29  sultSet->nExpr )
35420 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
35430 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
35440 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
35450 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
35460 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
35470 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20  erBy ){.    if( 
35480 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
35490 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
354a0 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20 69  NCTBY ){.      i
354b0 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65  f( pFrom->isOrde
354c0 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72  red==pWInfo->pOr
354d0 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
354e0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
354f0 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
35500 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
35510 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ED;.      }.    
35520 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49  }else{.      pWI
35530 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 46  nfo->nOBSat = pF
35540 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a  rom->isOrdered;.
35550 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
35560 2d 3e 6e 4f 42 53 61 74 3c 30 20 29 20 70 57 49  ->nOBSat<0 ) pWI
35570 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b  nfo->nOBSat = 0;
35580 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  .      pWInfo->r
35590 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
355a0 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20  revLoop;.    }. 
355b0 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
355c0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
355d0 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29 0a  RE_SORTBYGROUP).
355e0 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66          && pWInf
355f0 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e 66  o->nOBSat==pWInf
35600 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
35610 70 72 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  pr.    ){.      
35620 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20  Bitmask revMask 
35630 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  = 0;.      int n
35640 4f 72 64 65 72 20 3d 20 77 68 65 72 65 50 61 74  Order = wherePat
35650 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
35660 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  y(pWInfo, pWInfo
35670 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20  ->pOrderBy, .   
35680 20 20 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c         pFrom, 0,
35690 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d   nLoop-1, pFrom-
356a0 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c  >aLoop[nLoop-1],
356b0 20 26 72 65 76 4d 61 73 6b 0a 20 20 20 20 20 20   &revMask.      
356c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
356d0 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d   pWInfo->sorted=
356e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
356f0 6e 4f 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e  nOrder==pWInfo->
35700 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
35710 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  ){.        pWInf
35720 6f 2d 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20  o->sorted = 1;. 
35730 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72         pWInfo->r
35740 65 76 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b  evMask = revMask
35750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
35760 20 20 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e    }...  pWInfo->
35770 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d  nRowOut = pFrom-
35780 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65  >nRow;..  /* Fre
35790 65 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f  e temporary memo
357a0 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75  ry and return su
357b0 63 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74  ccess */.  sqlit
357c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 70  e3DbFree(db, pSp
357d0 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ace);.  return S
357e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
357f0 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20  ** Most queries 
35800 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  use only a singl
35810 65 20 74 61 62 6c 65 20 28 74 68 65 79 20 61 72  e table (they ar
35820 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64  e not joins) and
35830 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20   have.** simple 
35840 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  == constraints a
35850 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66  gainst indexed f
35860 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75  ields.  This rou
35870 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a  tine attempts.**
35880 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73   to plan those s
35890 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e  imple cases usin
358a0 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65  g much less cere
358b0 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a  mony than the.**
358c0 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   general-purpose
358d0 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20   query planner, 
358e0 61 6e 64 20 74 68 65 72 65 62 79 20 79 69 65 6c  and thereby yiel
358f0 64 20 66 61 73 74 65 72 20 73 71 6c 69 74 65 33  d faster sqlite3
35900 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69  _prepare().** ti
35910 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  mes for the comm
35920 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  on case..**.** R
35930 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  eturn non-zero o
35940 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20 74 68  n success, if th
35950 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 20  is query can be 
35960 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a  handled by this.
35970 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65  ** no-frills que
35980 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74  ry planner.  Ret
35990 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73  urn zero if this
359a0 20 71 75 65 72 79 20 6e 65 65 64 73 20 74 68 65   query needs the
359b0 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72   .** general-pur
359c0 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e  pose query plann
359d0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
359e0 74 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28  t whereShortCut(
359f0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
35a00 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57   *pBuilder){.  W
35a10 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
35a20 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
35a30 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
35a40 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
35a50 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  WC;.  WhereTerm 
35a60 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c  *pTerm;.  WhereL
35a70 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e  oop *pLoop;.  in
35a80 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b  t iCur;.  int j;
35a90 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
35aa0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
35ab0 20 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75   .  pWInfo = pBu
35ac0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
35ad0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
35ae0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
35af0 46 4f 52 43 45 5f 54 41 42 4c 45 20 29 20 72 65  FORCE_TABLE ) re
35b00 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
35b10 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  ( pWInfo->pTabLi
35b20 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20  st->nSrc>=1 );. 
35b30 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d   pItem = pWInfo-
35b40 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20  >pTabList->a;.  
35b50 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
35b60 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74  ab;.  if( IsVirt
35b70 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
35b80 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65  rn 0;.  if( pIte
35b90 6d 2d 3e 7a 49 6e 64 65 78 20 29 20 72 65 74 75  m->zIndex ) retu
35ba0 72 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d 20 70  rn 0;.  iCur = p
35bb0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
35bc0 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e   pWC = &pWInfo->
35bd0 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  sWC;.  pLoop = p
35be0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
35bf0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
35c00 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 53  = 0;.  pLoop->nS
35c10 6b 69 70 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d  kip = 0;.  pTerm
35c20 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
35c30 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f   iCur, -1, 0, WO
35c40 5f 45 51 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  _EQ, 0);.  if( p
35c50 54 65 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f  Term ){.    pLoo
35c60 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
35c70 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
35c80 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45  RE_IPK|WHERE_ONE
35c90 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  ROW;.    pLoop->
35ca0 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
35cb0 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  m;.    pLoop->nL
35cc0 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c  Term = 1;.    pL
35cd0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
35ce0 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e   = 1;.    /* TUN
35cf0 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72  ING: Cost of a r
35d00 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31  owid lookup is 1
35d10 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 */.    pLoop->
35d20 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33  rRun = 33;  /* 3
35d30 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
35d40 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  (10) */.  }else{
35d50 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
35d60 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
35d70 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
35d80 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
35d90 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  t( pLoop->aLTerm
35da0 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c  Space==pLoop->aL
35db0 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 69 66  Term );.      if
35dc0 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78  ( !IsUniqueIndex
35dd0 28 70 49 64 78 29 0a 20 20 20 20 20 20 20 7c 7c  (pIdx).       ||
35de0 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
35df0 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20 20  here!=0 .       
35e00 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  || pIdx->nKeyCol
35e10 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70  >ArraySize(pLoop
35e20 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20 0a  ->aLTermSpace) .
35e30 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75 65        ) continue
35e40 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
35e50 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   j<pIdx->nKeyCol
35e60 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
35e70 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
35e80 28 70 57 43 2c 20 69 43 75 72 2c 20 70 49 64 78  (pWC, iCur, pIdx
35e90 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30  ->aiColumn[j], 0
35ea0 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 3b 0a  , WO_EQ, pIdx);.
35eb0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
35ec0 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
35ed0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54        pLoop->aLT
35ee0 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[j] = pTerm;.
35ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
35f00 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ( j!=pIdx->nKeyC
35f10 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ol ) continue;. 
35f20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c       pLoop->wsFl
35f30 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
35f40 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52  MN_EQ|WHERE_ONER
35f50 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44  OW|WHERE_INDEXED
35f60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
35f70 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20  ->isCovering || 
35f80 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  (pItem->colUsed 
35f90 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  & ~columnsInInde
35fa0 78 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20  x(pIdx))==0 ){. 
35fb0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73         pLoop->ws
35fc0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49  Flags |= WHERE_I
35fd0 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  DX_ONLY;.      }
35fe0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  .      pLoop->nL
35ff0 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  Term = j;.      
36000 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
36010 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c  Eq = j;.      pL
36020 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
36030 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  dex = pIdx;.    
36040 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
36050 74 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e  t of a unique in
36060 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35  dex lookup is 15
36070 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   */.      pLoop-
36080 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20  >rRun = 39;  /* 
36090 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  39==sqlite3LogEs
360a0 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62  t(15) */.      b
360b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
360c0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
360d0 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f  lags ){.    pLoo
360e0 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73  p->nOut = (LogEs
360f0 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  t)1;.    pWInfo-
36100 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70  >a[0].pWLoop = p
36110 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  Loop;.    pLoop-
36120 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d  >maskSelf = getM
36130 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
36140 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20  skSet, iCur);.  
36150 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69    pWInfo->a[0].i
36160 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  TabCur = iCur;. 
36170 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f     pWInfo->nRowO
36180 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ut = 1;.    if( 
36190 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
361a0 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61   ) pWInfo->nOBSa
361b0 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  t =  pWInfo->pOr
361c0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
361d0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
361e0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
361f0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
36200 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
36210 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
36220 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
36230 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  E;.    }.#ifdef 
36240 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
36250 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30   pLoop->cId = '0
36260 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  ';.#endif.    re
36270 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
36280 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
36290 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65   Generate the be
362a0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c  ginning of the l
362b0 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45  oop used for WHE
362c0 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
362d0 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74  sing..** The ret
362e0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70  urn value is a p
362f0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61  ointer to an opa
36300 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68  que structure th
36310 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69  at contains.** i
36320 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65  nformation neede
36330 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  d to terminate t
36340 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c  he loop.  Later,
36350 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
36360 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69  tine.** should i
36370 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65  nvoke sqlite3Whe
36380 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65  reEnd() with the
36390 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
363a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
363b0 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
363c0 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45  mplete the WHERE
363d0 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
363e0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
363f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
36400 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
36410 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  ns NULL..**.** T
36420 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73  he basic idea is
36430 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20   to do a nested 
36440 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66  loop, one loop f
36450 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
36460 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
36470 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e  use of a select.
36480 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50    (INSERT and UP
36490 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20  DATE statements 
364a0 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  are the.** same 
364b0 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68  as a SELECT with
364c0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
364d0 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
364e0 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a   clause.)  For.*
364f0 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  * example, if th
36500 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a  e SQL is this:.*
36510 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43  *.**       SELEC
36520 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c  T * FROM t1, t2,
36530 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a   t3 WHERE ...;.*
36540 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f  *.** Then the co
36550 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20  de generated is 
36560 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b  conceptually lik
36570 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  e the following:
36580 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  .**.**      fore
36590 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
365a0 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64  o       \    Cod
365b0 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
365c0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
365d0 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20  w2 in t2 do     
365e0 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
365f0 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20  hereBegin().**  
36600 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
36610 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20  row3 in t3 do   
36620 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
36630 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
36640 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
36650 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64          \    Cod
36660 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
36670 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
36680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36690 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
366a0 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20  hereEnd().**    
366b0 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
366c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a                /.
366d0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
366e0 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20  the loops might 
366f0 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e  not be nested in
36700 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68   the order in wh
36710 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65  ich they.** appe
36720 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
36730 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65  lause if a diffe
36740 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65  rent order is be
36750 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b  tter able to mak
36760 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69  e.** use of indi
36770 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20  ces.  Note also 
36780 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e  that when the IN
36790 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72   operator appear
367a0 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52  s in.** the WHER
367b0 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67  E clause, it mig
367c0 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64  ht result in add
367d0 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c  itional nested l
367e0 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e  oops for.** scan
367f0 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c  ning through all
36800 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72   values on the r
36810 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
36820 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20  f the IN..**.** 
36830 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20  There are Btree 
36840 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
36850 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62  ed with each tab
36860 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72  le.  t1 uses cur
36870 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54  sor.** number pT
36880 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75  abList->a[0].iCu
36890 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74  rsor.  t2 uses t
368a0 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69  he cursor pTabLi
368b0 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72  st->a[1].iCursor
368c0 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74  ..** And so fort
368d0 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  h.  This routine
368e0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
368f0 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44  to open those VD
36900 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e  BE cursors.** an
36910 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
36920 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68  d() generates th
36930 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20  e code to close 
36940 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  them..**.** The 
36950 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65  code that sqlite
36960 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65  3WhereBegin() ge
36970 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74  nerates leaves t
36980 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64  he cursors named
36990 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20  .** in pTabList 
369a0 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69  pointing at thei
369b0 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e  r appropriate en
369c0 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e  tries.  The [...
369d0 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73  ] code.** can us
369e0 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20  e OP_Column and 
369f0 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73  OP_Rowid opcodes
36a00 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72   on these cursor
36a10 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20  s to extract.** 
36a20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61  data from the va
36a30 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20  rious tables of 
36a40 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
36a50 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
36a60 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  use is empty, th
36a70 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20  e foreach loops 
36a80 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74  must each scan t
36a90 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74  heir.** entire t
36aa0 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74  ables.  Thus a t
36ab0 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73  hree-way join is
36ac0 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61   an O(N^3) opera
36ad0 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a  tion.  But if.**
36ae0 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65   the tables have
36af0 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65   indices and the
36b00 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20  re are terms in 
36b10 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
36b20 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74   that.** refer t
36b30 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c  o those indices,
36b40 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c   a complete tabl
36b50 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76  e scan can be av
36b60 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  oided and the.**
36b70 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d   code will run m
36b80 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73  uch faster.  Mos
36b90 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66  t of the work of
36ba0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
36bb0 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20   checking.** to 
36bc0 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
36bd0 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61   indices that ca
36be0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65  n be used to spe
36bf0 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a  ed up the loop..
36c00 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74  **.** Terms of t
36c10 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
36c20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f  are also used to
36c30 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77   limit which row
36c40 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61  s actually.** ma
36c50 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e  ke it to the "..
36c60 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ." in the middle
36c70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41   of the loop.  A
36c80 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61  fter each "forea
36c90 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66  ch",.** terms of
36ca0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
36cb0 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20  e that use only 
36cc0 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f  terms in that lo
36cd0 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20  op and outer.** 
36ce0 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61  loops are evalua
36cf0 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65  ted and if false
36d00 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20   a jump is made 
36d10 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65  around all subse
36d20 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c  quent.** inner l
36d30 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20  oops (or around 
36d40 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65  the "..." if the
36d50 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74   test occurs wit
36d60 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a  hin the inner-.*
36d70 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a  * most loop).**.
36d80 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a  ** OUTER JOINS.*
36d90 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f  *.** An outer jo
36da0 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20  in of tables t1 
36db0 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70  and t2 is concep
36dc0 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66  tally coded as f
36dd0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
36de0 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
36df0 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66   t1 do.**      f
36e00 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20  lag = 0.**      
36e10 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
36e20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20  t2 do.**        
36e30 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20  start:.**       
36e40 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
36e50 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20     flag = 1.**  
36e60 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20      end.**      
36e70 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a  if flag==0 then.
36e80 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74  **        move t
36e90 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74  he row2 cursor t
36ea0 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20  o a null row.** 
36eb0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72         goto star
36ec0 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20  t.**      fi.** 
36ed0 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44     end.**.** ORD
36ee0 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f  ER BY CLAUSE PRO
36ef0 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f  CESSING.**.** pO
36f00 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e  rderBy is a poin
36f10 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52  ter to the ORDER
36f20 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72 20 74   BY clause (or t
36f30 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
36f40 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45  se.** if the WHE
36f50 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20  RE_GROUPBY flag 
36f60 69 73 20 73 65 74 20 69 6e 20 77 63 74 72 6c 46  is set in wctrlF
36f70 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c 45 43  lags) of a SELEC
36f80 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69  T statement.** i
36f90 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
36fa0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
36fb0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
36fc0 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  or if this routi
36fd0 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
36fe0 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f  from an UPDATE o
36ff0 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
37000 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42  nt, then pOrderB
37010 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  y is NULL..**.**
37020 20 54 68 65 20 69 49 64 78 43 75 72 20 70 61 72   The iIdxCur par
37030 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 63 75  ameter is the cu
37040 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61  rsor number of a
37050 6e 20 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a  n index.  If .**
37060 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
37070 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 49 64  ONLY is set, iId
37080 78 43 75 72 20 69 73 20 74 68 65 20 63 75 72 73  xCur is the curs
37090 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  or number of an 
370a0 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20  index.** to use 
370b0 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72  for OR clause pr
370c0 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 20 57  ocessing.  The W
370d0 48 45 52 45 20 63 6c 61 75 73 65 20 73 68 6f 75  HERE clause shou
370e0 6c 64 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 73  ld use this.** s
370f0 70 65 63 69 66 69 63 20 63 75 72 73 6f 72 2e 20  pecific cursor. 
37100 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 50 41 53   If WHERE_ONEPAS
37110 53 5f 44 45 53 49 52 45 44 20 69 73 20 73 65 74  S_DESIRED is set
37120 2c 20 74 68 65 6e 20 69 49 64 78 43 75 72 20 69  , then iIdxCur i
37130 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  s.** the first c
37140 75 72 73 6f 72 20 69 6e 20 61 6e 20 61 72 72 61  ursor in an arra
37150 79 20 6f 66 20 63 75 72 73 6f 72 73 20 66 6f 72  y of cursors for
37160 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20 69   all indices.  i
37170 49 64 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a  IdxCur should.**
37180 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   be used to comp
37190 75 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ute the appropri
371a0 61 74 65 20 63 75 72 73 6f 72 20 64 65 70 65 6e  ate cursor depen
371b0 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69 6e  ding on which in
371c0 64 65 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a  dex is.** used..
371d0 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
371e0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
371f0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
37200 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
37210 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
37220 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
37230 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f  bList,    /* FRO
37240 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74  M clause: A list
37250 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74   of all tables t
37260 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
37270 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
37280 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
37290 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
372a0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
372b0 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44  rBy,   /* An ORD
372c0 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
372d0 42 59 29 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e  BY) clause, or N
372e0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
372f0 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 2f  t *pResultSet, /
37300 2a 20 52 65 73 75 6c 74 20 73 65 74 20 6f 66 20  * Result set of 
37310 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 75  the query */.  u
37320 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
37330 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
37340 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
37350 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
37360 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74  teInt.h */.  int
37370 20 69 49 64 78 43 75 72 20 20 20 20 20 20 20 20   iIdxCur        
37380 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f     /* If WHERE_O
37390 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20  NETABLE_ONLY is 
373a0 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f  set, index curso
373b0 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  r number */.){. 
373c0 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b   int nByteWInfo;
373d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
373e0 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  um. bytes alloca
373f0 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66  ted for WhereInf
37400 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e  o struct */.  in
37410 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20  t nTabList;     
37420 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
37430 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
37440 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  n pTabList */.  
37450 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
37460 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69  o;         /* Wi
37470 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65  ll become the re
37480 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
37490 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
374a0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
374b0 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54  e->pVdbe;   /* T
374c0 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62  he virtual datab
374d0 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20  ase engine */.  
374e0 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
374f0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ;          /* Cu
37500 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
37510 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65  ot yet positione
37520 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  d */.  WhereLoop
37530 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20  Builder sWLB;   
37540 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
37550 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20  op builder */.  
37560 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
37570 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68  askSet;    /* Th
37580 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73  e expression mas
37590 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65  k set */.  Where
375a0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
375b0 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
375c0 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66  e level in pWInf
375d0 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  o->a[] */.  Wher
375e0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
375f0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
37600 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68  r to a single Wh
37610 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
37620 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  /.  int ii;     
37630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37640 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
37650 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
37660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37670 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
37680 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
37690 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
376a0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
376b0 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56  code */...  /* V
376c0 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69  ariable initiali
376d0 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d  zation */.  db =
376e0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d   pParse->db;.  m
376f0 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20  emset(&sWLB, 0, 
37700 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a  sizeof(sWLB));..
37710 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52    /* An ORDER/GR
37720 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 6f 66  OUP BY clause of
37730 20 6d 6f 72 65 20 74 68 61 6e 20 36 33 20 74 65   more than 63 te
37740 72 6d 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  rms cannot be op
37750 74 69 6d 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73  timized */.  tes
37760 74 63 61 73 65 28 20 70 4f 72 64 65 72 42 79 20  tcase( pOrderBy 
37770 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  && pOrderBy->nEx
37780 70 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69  pr==BMS-1 );.  i
37790 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70  f( pOrderBy && p
377a0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d  OrderBy->nExpr>=
377b0 42 4d 53 20 29 20 70 4f 72 64 65 72 42 79 20 3d  BMS ) pOrderBy =
377c0 20 30 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65   0;.  sWLB.pOrde
377d0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
377e0 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68  .  /* Disable th
377f0 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d  e DISTINCT optim
37800 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54  ization if SQLIT
37810 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73  E_DistinctOpt is
37820 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71   set via.  ** sq
37830 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28  lite3_test_ctrl(
37840 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
37850 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e  OPTIMIZATIONS,..
37860 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  .) */.  if( Opti
37870 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
37880 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74  (db, SQLITE_Dist
37890 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20  inctOpt) ){.    
378a0 77 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57  wctrlFlags &= ~W
378b0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
378c0 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  CT;.  }..  /* Th
378d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  e number of tabl
378e0 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
378f0 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
37900 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
37910 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61  f.  ** bits in a
37920 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20   Bitmask .  */. 
37930 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 4c   testcase( pTabL
37940 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29  ist->nSrc==BMS )
37950 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  ;.  if( pTabList
37960 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20  ->nSrc>BMS ){.  
37970 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
37980 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f  g(pParse, "at mo
37990 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20  st %d tables in 
379a0 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20  a join", BMS);. 
379b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
379c0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
379d0 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65  tion normally ge
379e0 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74 65 64  nerates a nested
379f0 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61   loop for all ta
37a00 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54  bles in .  ** pT
37a10 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20  abList.  But if 
37a20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  the WHERE_ONETAB
37a30 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20  LE_ONLY flag is 
37a40 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f  set, then we sho
37a50 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65  uld.  ** only ge
37a60 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
37a70 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20  the first table 
37a80 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20  in pTabList and 
37a90 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a  assume that.  **
37aa0 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73   any cursors ass
37ab0 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 75 62  ociated with sub
37ac0 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61  sequent tables a
37ad0 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  re uninitialized
37ae0 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73  ..  */.  nTabLis
37af0 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20  t = (wctrlFlags 
37b00 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
37b10 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61  _ONLY) ? 1 : pTa
37b20 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20  bList->nSrc;..  
37b30 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
37b40 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57  initialize the W
37b50 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
37b60 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  re that will bec
37b70 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74  ome the.  ** ret
37b80 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e  urn value. A sin
37b90 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  gle allocation i
37ba0 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
37bb0 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20  the WhereInfo.  
37bc0 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20 63  ** struct, the c
37bd0 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65  ontents of Where
37be0 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68  Info.a[], the Wh
37bf0 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
37c00 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ure.  ** and the
37c10 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
37c20 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57  ructure. Since W
37c30 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61  hereClause conta
37c40 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20  ins an 8-byte.  
37c50 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20 42  ** field (type B
37c60 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20  itmask) it must 
37c70 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e  be aligned on an
37c80 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79   8-byte boundary
37c90 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72   on.  ** some ar
37ca0 63 68 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e  chitectures. Hen
37cb0 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20  ce the ROUND8() 
37cc0 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42  below..  */.  nB
37cd0 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44  yteWInfo = ROUND
37ce0 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e  8(sizeof(WhereIn
37cf0 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29  fo)+(nTabList-1)
37d00 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76  *sizeof(WhereLev
37d10 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  el));.  pWInfo =
37d20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
37d30 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 57 49  Zero(db, nByteWI
37d40 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65  nfo + sizeof(Whe
37d50 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20  reLoop));.  if( 
37d60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
37d70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
37d80 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
37d90 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  );.    pWInfo = 
37da0 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  0;.    goto wher
37db0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
37dc0 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  .  pWInfo->aiCur
37dd0 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 57 49  OnePass[0] = pWI
37de0 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
37df0 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49  s[1] = -1;.  pWI
37e00 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54  nfo->nLevel = nT
37e10 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
37e20 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
37e30 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
37e40 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
37e50 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  ;.  pWInfo->pOrd
37e60 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
37e70 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  .  pWInfo->pResu
37e80 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53  ltSet = pResultS
37e90 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  et;.  pWInfo->iB
37ea0 72 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69  reak = pWInfo->i
37eb0 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
37ec0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
37ed0 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63  v);.  pWInfo->wc
37ee0 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c  trlFlags = wctrl
37ef0 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d  Flags;.  pWInfo-
37f00 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
37f10 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
37f20 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65  yLoop;.  pMaskSe
37f30 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  t = &pWInfo->sMa
37f40 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57  skSet;.  sWLB.pW
37f50 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20  Info = pWInfo;. 
37f60 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49   sWLB.pWC = &pWI
37f70 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42  nfo->sWC;.  sWLB
37f80 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f  .pNew = (WhereLo
37f90 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57 49  op*)(((char*)pWI
37fa0 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29  nfo)+nByteWInfo)
37fb0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
37fc0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
37fd0 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20  (sWLB.pNew) );. 
37fe0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73   whereLoopInit(s
37ff0 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65  WLB.pNew);.#ifde
38000 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
38010 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20   sWLB.pNew->cId 
38020 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20  = '*';.#endif.. 
38030 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48   /* Split the WH
38040 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20  ERE clause into 
38050 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72  separate subexpr
38060 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61  essions where ea
38070 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65  ch.  ** subexpre
38080 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
38090 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65  ed by an AND ope
380a0 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e  rator..  */.  in
380b0 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53  itMaskSet(pMaskS
380c0 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75  et);.  whereClau
380d0 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e  seInit(&pWInfo->
380e0 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  sWC, pWInfo);.  
380f0 77 68 65 72 65 53 70 6c 69 74 28 26 70 57 49 6e  whereSplit(&pWIn
38100 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72 65 2c  fo->sWC, pWhere,
38110 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20   TK_AND);.    . 
38120 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
38130 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  : a WHERE clause
38140 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e   that is constan
38150 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65  t.  E