/ Hex Artifact Content
Login

Artifact 0888567c0e01a41b6001647e333f8ccfd3ae7d36:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nOBSat;.}../*.*
05a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
05b0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
05c0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
05d0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
05e0: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
05f0: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
0600: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
0610: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
0620: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
0630: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
0640: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
0650: 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43  sert( pWInfo->iC
0660: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
0670: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0680: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
0690: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44  ** Return the VD
06a0: 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61  BE address or la
06b0: 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  bel to jump to i
06c0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b  n order to break
06d0: 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45  .** out of a WHE
06e0: 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  RE loop..*/.int 
06f0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
0700: 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  kLabel(WhereInfo
0710: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0720: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  urn pWInfo->iBre
0730: 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ak;.}../*.** Ret
0740: 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55  urn TRUE if an U
0750: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0760: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70  statement can op
0770: 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f  erate directly o
0780: 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20  n.** the rowids 
0790: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57 48  returned by a WH
07a0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74  ERE clause.  Ret
07b0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69  urn FALSE if doi
07c0: 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20  ng an.** UPDATE 
07d0: 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20  or DELETE might 
07e0: 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e  change subsequen
07f0: 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72  t WHERE clause r
0800: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  esults..**.** If
0810: 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
0820: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
0830: 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74 69  d (if this routi
0840: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 29  ne returns true)
0850: 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  .** then also wr
0860: 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73 20  ite the indices 
0870: 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20  of open cursors 
0880: 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a  used by ONEPASS.
0890: 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d  ** into aiCur[0]
08a0: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20   and aiCur[1].  
08b0: 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68  iaCur[0] gets th
08c0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
08d0: 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e  data.** table an
08e0: 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20  d iaCur[1] gets 
08f0: 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  the cursor used 
0900: 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  by an auxiliary 
0910: 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72  index..** Either
0920: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31   value may be -1
0930: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
0940: 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  t cursor is not 
0950: 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72  used..** Any cur
0960: 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77 69  sors returned wi
0970: 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ll have been ope
0980: 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ned for writing.
0990: 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20  .**.** aiCur[0] 
09a0: 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74  and aiCur[1] bot
09b0: 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65 20  h get -1 if the 
09c0: 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67  where-clause log
09d0: 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20  ic is.** unable 
09e0: 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41  to use the ONEPA
09f0: 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  SS optimization.
0a00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
0a10: 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68  hereOkOnePass(Wh
0a20: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
0a30: 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20   int *aiCur){.  
0a40: 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57  memcpy(aiCur, pW
0a50: 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
0a60: 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  ss, sizeof(int)*
0a70: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  2);.  return pWI
0a80: 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a  nfo->okOnePass;.
0a90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0aa0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0ab0: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0ad0: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0ae0: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0af0: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0b00: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0b10: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0b20: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0b30: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0b40: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0b50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0b60: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0b70: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0b80: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0b90: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0ba0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0bb0: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0bc0: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0bd0: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0be0: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0bf0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0c00: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0c10: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0c20: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0c30: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0c40: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0c50: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0c60: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0c70: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0c80: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0c90: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0ca0: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0cb0: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0cc0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0cd0: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0ce0: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0cf0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0d00: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0d20: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0d30: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0d40: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0d50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0d60: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0d70: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0d80: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
0d90: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
0da0: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
0db0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
0dc0: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
0dd0: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
0de0: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
0df0: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
0e00: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
0e10: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
0e20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
0e30: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
0e40: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
0e50: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
0e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0e70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0e80: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
0e90: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
0ea0: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
0eb0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
0ec0: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
0ed0: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
0ee0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
0ef0: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
0f00: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
0f10: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
0f20: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
0f30: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
0f40: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
0f50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
0f60: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f70: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
0f80: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
0f90: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
0fa0: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
0fb0: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
0fc0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
0fd0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
0fe0: 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57  a preallocated W
0ff0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
1000: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
1010: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
1020: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61  Init(.  WhereCla
1030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
1040: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61   /* The WhereCla
1050: 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  use to be initia
1060: 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lized */.  Where
1070: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20  Info *pWInfo    
1080: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1090: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
10a0: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d  ext */.){.  pWC-
10b0: 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  >pWInfo = pWInfo
10c0: 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20  ;.  pWC->pOuter 
10d0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  = 0;.  pWC->nTer
10e0: 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53  m = 0;.  pWC->nS
10f0: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
1100: 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20  pWC->aStatic);. 
1110: 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61   pWC->a = pWC->a
1120: 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Static;.}../* Fo
1130: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
1140: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1150: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
1160: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
1170: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
1180: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
1190: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
11a0: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
11b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11c0: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
11d0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
11e0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
11f0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
1200: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
1210: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1220: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
1230: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
1240: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
1250: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
1260: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
1270: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
1280: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
1290: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
12a0: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
12b0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
12c0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
12d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
12e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
12f0: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
1300: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
1310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
1330: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
1340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1350: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
1360: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1370: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1380: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1390: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
13a0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
13b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
13c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13d0: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
13e0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
13f0: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
1400: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
1410: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
1420: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
1430: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
1440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1450: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
1460: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
1470: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
1480: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
1490: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
14a0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
14b0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
14c0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
14d0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
14e0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
14f0: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
1500: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
1510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1520: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
1530: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
1540: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1550: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
1560: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
1570: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
1580: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
1590: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
15a0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
15b0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
15c0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
15d0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
15e0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
15f0: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
1600: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
1610: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
1620: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1630: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
1640: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
1650: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
1660: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
1670: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
1680: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1690: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
16a0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
16b0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
16c0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
16d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
16e0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
16f0: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
1700: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
1710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1720: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
1730: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1740: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
1750: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
1760: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
1770: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
1780: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
1790: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
17a0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
17b0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
17c0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
17d0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
17e0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
17f0: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
1800: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
1810: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
1820: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
1830: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1840: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
1850: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
1860: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
1870: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
1880: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
1890: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
18a0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
18b0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
18c0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
18d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
18e0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
18f0: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
1900: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
1910: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
1920: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
1930: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
1940: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
1950: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
1960: 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29   *p, u8 wtFlags)
1970: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
1980: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
1990: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46  .  testcase( wtF
19a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
19b0: 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57 43  UAL );.  if( pWC
19c0: 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53  ->nTerm>=pWC->nS
19d0: 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65  lot ){.    Where
19e0: 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43  Term *pOld = pWC
19f0: 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ->a;.    sqlite3
1a00: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e   *db = pWC->pWIn
1a10: 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
1a20: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c      pWC->a = sql
1a30: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1a40: 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e  db, sizeof(pWC->
1a50: 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74  a[0])*pWC->nSlot
1a60: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57  *2 );.    if( pW
1a70: 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  C->a==0 ){.     
1a80: 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54   if( wtFlags & T
1a90: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
1aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ab0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  prDelete(db, p);
1ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ad0: 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20  WC->a = pOld;.  
1ae0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1af0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1b00: 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a  WC->a, pOld, siz
1b10: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
1b20: 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  WC->nTerm);.    
1b30: 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61  if( pOld!=pWC->a
1b40: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
1b50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1b60: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  , pOld);.    }. 
1b70: 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20     pWC->nSlot = 
1b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1b90: 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f  ize(db, pWC->a)/
1ba0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
1bb0: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
1bc0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
1bd0: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
1be0: 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61 73  if( p && ExprHas
1bf0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 55  Property(p, EP_U
1c00: 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20  nlikely) ){.    
1c10: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c20: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1c30: 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 39 39  (p->iTable) - 99
1c40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1c50: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 20  Term->truthProb 
1c60: 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  = 1;.  }.  pTerm
1c70: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
1c80: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1c90: 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  (p);.  pTerm->wt
1ca0: 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b  Flags = wtFlags;
1cb0: 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20  .  pTerm->pWC = 
1cc0: 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50  pWC;.  pTerm->iP
1cd0: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65  arent = -1;.  re
1ce0: 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a  turn idx;.}../*.
1cf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d00: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
1d10: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
1d20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
1d30: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
1d40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
1d50: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e  arated by the AN
1d60: 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f  D operator or so
1d70: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72  me other.** oper
1d80: 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  ator specified i
1d90: 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  n the op paramet
1da0: 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  er.  The WhereCl
1db0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
1dc0: 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  * is filled with
1dd0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62   pointers to sub
1de0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
1df0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
1e00: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
1e10: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
1e20: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
1e30: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
1e40: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
1e50: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
1e60: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
1e70: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
1e80: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
1e90: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
1ea0: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ec0: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
1ed0: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
1ee0: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
1ef0: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
1f00: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
1f10: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
1f20: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
1f30: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
1f40: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
1f50: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
1f60: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
1f70: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
1f80: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
1f90: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
1fa0: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
1fb0: 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74  array.  The slot
1fc0: 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61  [] array grows a
1fd0: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74  s needed to cont
1fe0: 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73  ain.** all terms
1ff0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2000: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
2010: 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28  void whereSplit(
2020: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2030: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75  , Expr *pExpr, u
2040: 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70  8 op){.  pWC->op
2050: 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 78   = op;.  if( pEx
2060: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
2070: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2080: 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65  =op ){.    where
2090: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
20a0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  , pExpr, 0);.  }
20b0: 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53  else{.    whereS
20c0: 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d  plit(pWC, pExpr-
20d0: 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20  >pLeft, op);.   
20e0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
20f0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
2100: 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  op);.  }.}../*.*
2110: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
2120: 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65  hereMaskSet obje
2130: 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e  ct.*/.#define in
2140: 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28 50  itMaskSet(P)  (P
2150: 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52 65  )->n=0../*.** Re
2160: 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  turn the bitmask
2170: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
2180: 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52  ursor number.  R
2190: 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43  eturn 0 if.** iC
21a0: 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
21b0: 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  the set..*/.stat
21c0: 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61  ic Bitmask getMa
21d0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
21e0: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
21f0: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69  Cursor){.  int i
2200: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73  ;.  assert( pMas
2210: 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69  kSet->n<=(int)si
2220: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20  zeof(Bitmask)*8 
2230: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2240: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b  pMaskSet->n; i++
2250: 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b  ){.    if( pMask
2260: 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72  Set->ix[i]==iCur
2270: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sor ){.      ret
2280: 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a  urn MASKBIT(i);.
2290: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
22b0: 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b  reate a new mask
22c0: 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72   for cursor iCur
22d0: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  sor..**.** There
22e0: 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70   is one cursor p
22f0: 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  er table in the 
2300: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
2310: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74  e number of.** t
2320: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2330: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
2340: 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61  ted by a test ea
2350: 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71  rly in the.** sq
2360: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2370: 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77  ) routine.  So w
2380: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
2390: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a  pMaskSet->ix[].*
23a0: 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76  * array will nev
23b0: 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a  er overflow..*/.
23c0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
23d0: 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  teMask(WhereMask
23e0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
23f0: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61  nt iCursor){.  a
2400: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
2410: 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70  >n < ArraySize(p
2420: 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a  MaskSet->ix) );.
2430: 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70    pMaskSet->ix[p
2440: 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20  MaskSet->n++] = 
2450: 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCursor;.}../*.*
2460: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
2470: 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76 65   walk (recursive
2480: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
2490: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
24a0: 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b  ate.** a bitmask
24b0: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63   indicating whic
24c0: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65  h tables are use
24d0: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  d in that expres
24e0: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2f  sion.** tree..*/
24f0: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
2500: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2510: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
2520: 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
2530: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
2540: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
2550: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c  e(WhereMaskSet*,
2560: 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69   Select*);.stati
2570: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61  c Bitmask exprTa
2580: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2590: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
25a0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
25b0: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
25c0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
25d0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  rn 0;.  if( p->o
25e0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
25f0: 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61      mask = getMa
2600: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  sk(pMaskSet, p->
2610: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74  iTable);.    ret
2620: 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20  urn mask;.  }.  
2630: 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65  mask = exprTable
2640: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2650: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61  p->pRight);.  ma
2660: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
2670: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2680: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
2690: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26a0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
26b0: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20   ){.    mask |= 
26c0: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
26d0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
26e0: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
26f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20  }else{.    mask 
2700: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
2710: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2720: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
2730: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
2740: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
2750: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2760: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2770: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
2780: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
2790: 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b  int i;.  Bitmask
27a0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
27b0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
27c0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
27d0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
27e0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
27f0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2800: 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  et, pList->a[i].
2810: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2820: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
2830: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
2840: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
2850: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
2860: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53  Set *pMaskSet, S
2870: 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69  elect *pS){.  Bi
2880: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
2890: 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20    while( pS ){. 
28a0: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
28b0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
28c0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
28d0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
28e0: 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74  kSet, pS->pEList
28f0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2900: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2910: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
2920: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d  pGroupBy);.    m
2930: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
2940: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2950: 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79  et, pS->pOrderBy
2960: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2970: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
2980: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65  askSet, pS->pWhe
2990: 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  re);.    mask |=
29a0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
29b0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48  pMaskSet, pS->pH
29c0: 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20  aving);.    if( 
29d0: 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29 20  ALWAYS(pSrc!=0) 
29e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
29f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2a00: 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
2a10: 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20  ){.        mask 
2a20: 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  |= exprSelectTab
2a30: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2a40: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  , pSrc->a[i].pSe
2a50: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d  lect);.        m
2a60: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2a70: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2a80: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b  pSrc->a[i].pOn);
2a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2aa0: 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69     pS = pS->pPri
2ab0: 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
2ac0: 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   mask;.}../*.** 
2ad0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2ae0: 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f  he given operato
2af0: 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  r is one of the 
2b00: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2b10: 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72  s.** allowed for
2b20: 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48   an indexable WH
2b30: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
2b40: 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70    The allowed op
2b50: 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22  erators are.** "
2b60: 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c  =", "<", ">", "<
2b70: 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c 20  =", ">=", "IN", 
2b80: 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a 2f  and "IS NULL".*/
2b90: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
2ba0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
2bb0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
2bc0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
2bd0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2be0: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
2bf0: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
2c00: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
2c10: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
2c20: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2c30: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
2c40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
2c50: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
2c60: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
2c70: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
2c80: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
2c90: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
2ca0: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
2cb0: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
2cc0: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
2cd0: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
2ce0: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
2cf0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
2d00: 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  .  Expressions o
2d10: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70  f the form "X op
2d20: 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65   Y".** are conve
2d30: 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20  rted into "Y op 
2d40: 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65 66  X"..**.** If lef
2d50: 74 2f 72 69 67 68 74 20 70 72 65 63 65 64 65 6e  t/right preceden
2d60: 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20 69 6e  ce rules come in
2d70: 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64 65 74  to play when det
2d80: 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20  ermining the.** 
2d90: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2da0: 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41 54 45  ce, then COLLATE
2db0: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 61   operators are a
2dc0: 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73 75 72  djusted to ensur
2dd0: 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f  e.** that the co
2de0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
2df0: 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65   does not change
2e00: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
2e10: 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f  ** "Y collate NO
2e20: 43 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d  CASE op X" becom
2e30: 65 73 20 22 58 20 6f 70 20 59 22 20 62 65 63 61  es "X op Y" beca
2e40: 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  use any collatio
2e50: 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a  n sequence on.**
2e60: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73   the left hand s
2e70: 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  ide of a compari
2e80: 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  son overrides an
2e90: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
2ea0: 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65  ence .** attache
2eb0: 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20  d to the right. 
2ec0: 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61  For the same rea
2ed0: 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  son the EP_Colla
2ee0: 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f  te flag.** is no
2ef0: 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73  t commuted..*/.s
2f00: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
2f10: 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50  ommute(Parse *pP
2f20: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
2f30: 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67  r){.  u16 expRig
2f40: 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69  ht = (pExpr->pRi
2f50: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
2f60: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20  Collate);.  u16 
2f70: 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72  expLeft = (pExpr
2f80: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
2f90: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20   EP_Collate);.  
2fa0: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
2fb0: 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20  p(pExpr->op) && 
2fc0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  pExpr->op!=TK_IN
2fd0: 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52 69 67   );.  if( expRig
2fe0: 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b 0a 20  ht==expLeft ){. 
2ff0: 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58 20 61     /* Either X a
3000: 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65 20 43  nd Y both have C
3010: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
3020: 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20 2a 2f  or neither do */
3030: 0a 20 20 20 20 69 66 28 20 65 78 70 52 69 67 68  .    if( expRigh
3040: 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 6f  t ){.      /* Bo
3050: 74 68 20 58 20 61 6e 64 20 59 20 68 61 76 65 20  th X and Y have 
3060: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
3070: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 58 20  s.  Make sure X 
3080: 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  is always.      
3090: 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65 61 72  ** used by clear
30a0: 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  ing the EP_Colla
30b0: 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59 2e 20  te flag from Y. 
30c0: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
30d0: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 3d  pRight->flags &=
30e0: 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20   ~EP_Collate;.  
30f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
3100: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
3110: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
3120: 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
3130: 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20 6e 6f   /* Neither X no
3140: 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45  r Y have COLLATE
3150: 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75 74 20   operators, but 
3160: 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61  X has a non-defa
3170: 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  ult.      ** col
3180: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
3190: 20 20 53 6f 20 61 64 64 20 74 68 65 20 45 50 5f    So add the EP_
31a0: 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72 20 6f  Collate marker o
31b0: 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20 20 20  n X to cause.   
31c0: 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 73     ** it to be s
31d0: 65 61 72 63 68 65 64 20 66 69 72 73 74 2e 20 2a  earched first. *
31e0: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  /.      pExpr->p
31f0: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Left->flags |= E
3200: 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d  P_Collate;.    }
3210: 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78 70 72  .  }.  SWAP(Expr
3220: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  *,pExpr->pRight,
3230: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
3240: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d   if( pExpr->op>=
3250: 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73  TK_GT ){.    ass
3260: 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
3270: 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  T+2 );.    asser
3280: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b  t( TK_GE==TK_LE+
3290: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
32a0: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a   TK_GT>TK_EQ );.
32b0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
32c0: 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61  T<TK_LE );.    a
32d0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
32e0: 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72  >=TK_GT && pExpr
32f0: 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op<=TK_GE );. 
3300: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28     pExpr->op = (
3310: 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54  (pExpr->op-TK_GT
3320: 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a  )^2)+TK_GT;.  }.
3330: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  }../*.** Transla
3340: 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70  te from TK_xx op
3350: 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20  erator to WO_xx 
3360: 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74  bitmask..*/.stat
3370: 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d  ic u16 operatorM
3380: 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75  ask(int op){.  u
3390: 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20  16 c;.  assert( 
33a0: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b  allowedOp(op) );
33b0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
33c0: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
33d0: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  N;.  }else if( o
33e0: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
33f0: 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c      c = WO_ISNUL
3400: 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
3410: 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c  assert( (WO_EQ<<
3420: 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78  (op-TK_EQ)) < 0x
3430: 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20  7fff );.    c = 
3440: 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70  (u16)(WO_EQ<<(op
3450: 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20  -TK_EQ));.  }.  
3460: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
3470: 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49  SNULL || c==WO_I
3480: 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  SNULL );.  asser
3490: 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20  t( op!=TK_IN || 
34a0: 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73  c==WO_IN );.  as
34b0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20  sert( op!=TK_EQ 
34c0: 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20  || c==WO_EQ );. 
34d0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
34e0: 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29  LT || c==WO_LT )
34f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
3500: 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c  TK_LE || c==WO_L
3510: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  E );.  assert( o
3520: 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57  p!=TK_GT || c==W
3530: 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_GT );.  assert
3540: 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63  ( op!=TK_GE || c
3550: 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74  ==WO_GE );.  ret
3560: 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn c;.}../*.** 
3570: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
3580: 65 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68  ext WhereTerm th
3590: 61 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72  at matches accor
35a0: 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74  ding to the crit
35b0: 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73  eria.** establis
35c0: 68 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63  hed when the pSc
35d0: 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e  an object was in
35e0: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65  itialized by whe
35f0: 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a  reScanInit()..**
3600: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3610: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
3620: 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65  e matching Where
3630: 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Terms..*/.static
3640: 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72   WhereTerm *wher
3650: 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53  eScanNext(WhereS
3660: 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69  can *pScan){.  i
3670: 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
3680: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
3690: 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  r on the LHS of 
36a0: 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  the term */.  in
36b0: 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
36c0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e     /* The column
36d0: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
36e0: 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72  he term.  -1 for
36f0: 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a   IPK */.  Expr *
3700: 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pX;            /
3710: 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  * An expression 
3720: 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a  being tested */.
3730: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
3740: 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68  WC;    /* Shorth
3750: 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70  and for pScan->p
3760: 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  WC */.  WhereTer
3770: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20  m *pTerm;    /* 
3780: 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74  The term being t
3790: 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b  ested */.  int k
37a0: 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20   = pScan->k;    
37b0: 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72  /* Where to star
37c0: 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20  t scanning */.. 
37d0: 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69   while( pScan->i
37e0: 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45  Equiv<=pScan->nE
37f0: 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72  quiv ){.    iCur
3800: 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76   = pScan->aEquiv
3810: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 32  [pScan->iEquiv-2
3820: 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  ];.    iColumn =
3830: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70   pScan->aEquiv[p
3840: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
3850: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 57 43  .    while( (pWC
3860: 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29 21 3d   = pScan->pWC)!=
3870: 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  0 ){.      for(p
3880: 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b 20 6b  Term=pWC->a+k; k
3890: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 2b 2b  <pWC->nTerm; k++
38a0: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
38b0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
38c0: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a  eftCursor==iCur.
38d0: 20 20 20 20 20 20 20 20 20 26 26 20 70 54 65 72           && pTer
38e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
38f0: 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  =iColumn.       
3900: 20 20 26 26 20 28 70 53 63 61 6e 2d 3e 69 45 71    && (pScan->iEq
3910: 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78 70 72 48  uiv<=2 || !ExprH
3920: 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
3930: 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
3940: 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 20 20 29  Join)).        )
3950: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
3960: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
3970: 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30  r & WO_EQUIV)!=0
3980: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
3990: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72  Scan->nEquiv<Arr
39a0: 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 45  aySize(pScan->aE
39b0: 71 75 69 76 29 0a 20 20 20 20 20 20 20 20 20 20  quiv).          
39c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
39d0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  nt j;.          
39e0: 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78    pX = sqlite3Ex
39f0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 54  prSkipCollate(pT
3a00: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
3a10: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ht);.           
3a20: 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
3a30: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
3a40: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
3a50: 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75  0; j<pScan->nEqu
3a60: 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20 20 20  iv; j+=2){.     
3a70: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3a80: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d 3d 70  an->aEquiv[j]==p
3a90: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
3aa0: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
3ab0: 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 3d 3d  n->aEquiv[j+1]==
3ac0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3af0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3b00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3b10: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
3b20: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
3b30: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
3b40: 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d 3e 69  Equiv[j] = pX->i
3b50: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
3b60: 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75       pScan->aEqu
3b70: 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69 43  iv[j+1] = pX->iC
3b80: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
3b90: 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75       pScan->nEqu
3ba0: 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  iv += 2;.       
3bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3bc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
3bd0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3be0: 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d 61  or & pScan->opMa
3bf0: 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
3c00: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
3c10: 74 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e 64  the affinity and
3c20: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
3c30: 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  nce match */.   
3c40: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3c50: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26  an->zCollName &&
3c60: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3c70: 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d  or & WO_ISNULL)=
3c80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3c90: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
3ca0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
3cb0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
3cc0: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  = pWC->pWInfo->p
3cd0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
3ce0: 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d       pX = pTerm-
3cf0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
3d00: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
3d10: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
3d20: 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64 78  k(pX, pScan->idx
3d30: 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  aff) ){.        
3d40: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
3d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3d60: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
3d70: 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74  assert(pX->pLeft
3d80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3d90: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
3da0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
3db0: 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20 20 20  lSeq(pParse,.   
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3df0: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
3e00: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
3e10: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
3e20: 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72  0 ) pColl = pPar
3e30: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
3e40: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
3e50: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
3e60: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
3e70: 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  , pScan->zCollNa
3e80: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  me) ){.         
3e90: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
3ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
3eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3ec0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
3ed0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
3ee0: 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20 20   & WO_EQ)!=0.   
3ef0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
3f00: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
3f10: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
3f20: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
3f30: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
3f40: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  le==pScan->aEqui
3f50: 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[0].           
3f60: 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e    && pX->iColumn
3f70: 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ==pScan->aEquiv[
3f80: 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  1].            )
3f90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3fa0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3fc0: 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b      pScan->k = k
3fd0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1;.            
3fe0: 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20  return pTerm;.  
3ff0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4000: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4010: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
4020: 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65  Scan->pWC->pOute
4030: 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a  r;.      k = 0;.
4040: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
4050: 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f  >pWC = pScan->pO
4060: 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30  rigWC;.    k = 0
4070: 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71  ;.    pScan->iEq
4080: 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  uiv += 2;.  }.  
4090: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
40a0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
40b0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61  WHERE clause sca
40c0: 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65  nner object.  Re
40d0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
40e0: 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d  o the.** first m
40f0: 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55  atch.  Return NU
4100: 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  LL if there are 
4110: 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a  no matches..**.*
4120: 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69  * The scanner wi
4130: 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20  ll be searching 
4140: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4150: 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c   pWC.  It will l
4160: 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73  ook.** for terms
4170: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
4180: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65  <op> <expr>" whe
4190: 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69  re X is column i
41a0: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a  Column of table.
41b0: 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20 3c 6f  ** iCur.  The <o
41c0: 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p> must be one o
41d0: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  f the operators 
41e0: 64 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d  described by opM
41f0: 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ask..**.** If th
4200: 65 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20  e search is for 
4210: 58 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20  X and the WHERE 
4220: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
4230: 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
4240: 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68  form X=Y then th
4250: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
4260: 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72   also return ter
4270: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ms of the form.*
4280: 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  * "Y <op> <expr>
4290: 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  ".  The number o
42a0: 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e  f levels of tran
42b0: 73 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69  sitivity is limi
42c0: 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65  ted,.** but is e
42d0: 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20  nough to handle 
42e0: 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63  most commonly oc
42f0: 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74  curring SQL stat
4300: 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ements..**.** If
4310: 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e   X is not the IN
4320: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4330: 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65  Y then X must be
4340: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
4350: 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  .** index pIdx..
4360: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
4370: 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e  erm *whereScanIn
4380: 69 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20  it(.  WhereScan 
4390: 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a  *pScan,       /*
43a0: 20 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f   The WhereScan o
43b0: 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74  bject being init
43c0: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65  ialized */.  Whe
43d0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
43e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
43f0: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
4400: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  canned */.  int 
4410: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
4420: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
4430: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69   scan for */.  i
4440: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
4450: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
4460: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
4470: 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20    u32 opMask,   
4480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
4490: 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e  rator(s) to scan
44a0: 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20   for */.  Index 
44b0: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
44c0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
44d0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
44e0: 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  s index */.){.  
44f0: 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65 6d  int j;..  /* mem
4500: 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69  set(pScan, 0, si
4510: 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 20 2a  zeof(*pScan)); *
4520: 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67  /.  pScan->pOrig
4530: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61  WC = pWC;.  pSca
4540: 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  n->pWC = pWC;.  
4550: 69 66 28 20 70 49 64 78 20 26 26 20 69 43 6f 6c  if( pIdx && iCol
4560: 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53  umn>=0 ){.    pS
4570: 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49  can->idxaff = pI
4580: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
4590: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
45a0: 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ty;.    for(j=0;
45b0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
45c0: 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  j]!=iColumn; j++
45d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56  ){.      if( NEV
45e0: 45 52 28 6a 3e 70 49 64 78 2d 3e 6e 43 6f 6c 75  ER(j>pIdx->nColu
45f0: 6d 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  mn) ) return 0;.
4600: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
4610: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64  >zCollName = pId
4620: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  x->azColl[j];.  
4630: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61 6e  }else{.    pScan
4640: 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20 20  ->idxaff = 0;.  
4650: 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61    pScan->zCollNa
4660: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53  me = 0;.  }.  pS
4670: 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f 70  can->opMask = op
4680: 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e 6b  Mask;.  pScan->k
4690: 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 61   = 0;.  pScan->a
46a0: 45 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72 3b  Equiv[0] = iCur;
46b0: 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  .  pScan->aEquiv
46c0: 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20  [1] = iColumn;. 
46d0: 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 3d   pScan->nEquiv =
46e0: 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45 71   2;.  pScan->iEq
46f0: 75 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75 72  uiv = 2;.  retur
4700: 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  n whereScanNext(
4710: 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pScan);.}../*.**
4720: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65   Search for a te
4730: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
4740: 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f  clause that is o
4750: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
4760: 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68  p> <expr>".** wh
4770: 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72  ere X is a refer
4780: 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c  ence to the iCol
4790: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
47a0: 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e  r and <op> is on
47b0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78  e of.** the WO_x
47c0: 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73  x operator codes
47d0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
47e0: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a  e op parameter..
47f0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
4800: 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e  ter to the term.
4810: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
4820: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54  t found..**.** T
4830: 68 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64  he term returned
4840: 20 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78 70   might by Y=<exp
4850: 72 3e 20 69 66 20 74 68 65 72 65 20 69 73 20 61  r> if there is a
4860: 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e  nother constrain
4870: 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52  t in.** the WHER
4880: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 73 70  E clause that sp
4890: 65 63 69 66 69 65 73 20 74 68 61 74 20 58 3d 59  ecifies that X=Y
48a0: 2e 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e 73  .  Any such cons
48b0: 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a  traints will be.
48c0: 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ** identified by
48d0: 20 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62 69   the WO_EQUIV bi
48e0: 74 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e  t in the pTerm->
48f0: 65 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64 2e  eOperator field.
4900: 20 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76 5b    The.** aEquiv[
4910: 5d 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58 20  ] array holds X 
4920: 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75 69  and all its equi
4930: 76 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65 61  valents, with ea
4940: 63 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65 0a  ch SQL variable.
4950: 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77 6f  ** taking up two
4960: 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76   slots in aEquiv
4970: 5b 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20 73  [].  The first s
4980: 6c 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20 63  lot is for the c
4990: 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a 20  ursor number.** 
49a0: 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 69  and the second i
49b0: 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  s for the column
49c0: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65 20   number.  There 
49d0: 61 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e 20  are 22 slots in 
49e0: 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20 74  aEquiv[].** so t
49f0: 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e  hat means we can
4a00: 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73   look for X plus
4a10: 20 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72 20   up to 10 other 
4a20: 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65  equivalent value
4a30: 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73 65  s..** Hence a se
4a40: 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20  arch for X will 
4a50: 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66  return <expr> if
4a60: 20 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32 20   X=A1 and A1=A2 
4a70: 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e 64  and A2=A3.** and
4a80: 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20   ... and A9=A10 
4a90: 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a  and A10=<expr>..
4aa0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
4ab0: 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d  re multiple term
4ac0: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
4ad0: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
4ae0: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
4af0: 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f  ".** then try fo
4b00: 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e  r the one with n
4b10: 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f  o dependencies o
4b20: 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74  n <expr> - in ot
4b30: 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a  her words where.
4b40: 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  ** <expr> is a c
4b50: 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
4b60: 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  on of some kind.
4b70: 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e    Only return en
4b80: 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  tries of.** the 
4b90: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20  form "X <op> Y" 
4ba0: 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c  where Y is a col
4bb0: 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  umn in another t
4bc0: 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73  able if no terms
4bd0: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20   of.** the form 
4be0: 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65  "X <op> <const-e
4bf0: 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49  xpr>" exist.   I
4c00: 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20  f no terms with 
4c10: 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a  a constant RHS.*
4c20: 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20  * exist, try to 
4c30: 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68  return a term th
4c40: 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
4c50: 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 73 74 61  WO_EQUIV..*/.sta
4c60: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66  tic WhereTerm *f
4c70: 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65  indTerm(.  Where
4c80: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
4c90: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
4ca0: 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63  ause to be searc
4cb0: 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  hed */.  int iCu
4cc0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
4cd0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
4ce0: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20  of LHS */.  int 
4cf0: 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  iColumn,        
4d00: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
4d10: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42  er of LHS */.  B
4d20: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
4d30: 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74       /* RHS must
4d40: 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74   not overlap wit
4d50: 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20  h this mask */. 
4d60: 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20   u32 op,        
4d70: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
4d80: 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64  f WO_xx values d
4d90: 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74  escribing operat
4da0: 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  or */.  Index *p
4db0: 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Idx           /*
4dc0: 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69   Must be compati
4dd0: 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e  ble with this in
4de0: 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  dex, if not NULL
4df0: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
4e00: 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b  rm *pResult = 0;
4e10: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 3b  .  WhereTerm *p;
4e20: 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61  .  WhereScan sca
4e30: 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65 53  n;..  p = whereS
4e40: 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70  canInit(&scan, p
4e50: 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75 6d  WC, iCur, iColum
4e60: 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20 20  n, op, pIdx);.  
4e70: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
4e80: 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52 69  if( (p->prereqRi
4e90: 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  ght & notReady)=
4ea0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
4eb0: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d  p->prereqRight==
4ec0: 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61 74  0 && (p->eOperat
4ed0: 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 29 7b 0a  or&WO_EQ)!=0 ){.
4ee0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
4ef0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4f00: 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29  if( pResult==0 )
4f10: 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20   pResult = p;.  
4f20: 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72    }.    p = wher
4f30: 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
4f40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
4f50: 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Result;.}../* Fo
4f60: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
4f70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
4f80: 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69  xprAnalyze(SrcLi
4f90: 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  st*, WhereClause
4fa0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
4fb0: 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65  Call exprAnalyze
4fc0: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e   on all terms in
4fd0: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
4fe0: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69    .*/.static voi
4ff0: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c  d exprAnalyzeAll
5000: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  (.  SrcList *pTa
5010: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  bList,       /* 
5020: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
5030: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
5040: 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f 2a   *pWC         /*
5050: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
5060: 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  e to be analyzed
5070: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
5080: 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
5090: 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  rm-1; i>=0; i--)
50a0: 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  {.    exprAnalyz
50b0: 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43 2c  e(pTabList, pWC,
50c0: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e   i);.  }.}..#ifn
50d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
50e0: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
50f0: 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  N./*.** Check to
5100: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
5110: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
5120: 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f  a LIKE or GLOB o
5130: 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20  perator that.** 
5140: 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  can be optimized
5150: 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69 74   using inequalit
5160: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  y constraints.  
5170: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  Return TRUE if i
5180: 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66  t is.** so and f
5190: 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  alse if not..**.
51a0: 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  ** In order for 
51b0: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  the operator to 
51c0: 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20  be optimizible, 
51d0: 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65 20  the RHS must be 
51e0: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65  a string.** lite
51f0: 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ral that does no
5200: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 77  t begin with a w
5210: 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73 74  ildcard.  .*/.st
5220: 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f  atic int isLikeO
5230: 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65 20 2a  rGlob(.  Parse *
5240: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
5250: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
5260: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
5270: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
5280: 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73 74  pr,      /* Test
5290: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
52a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 50   */.  Expr **ppP
52b0: 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69 6e 74  refix,  /* Point
52c0: 65 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e 47 20  er to TK_STRING 
52d0: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
52e0: 70 61 74 74 65 72 6e 20 70 72 65 66 69 78 20 2a  pattern prefix *
52f0: 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70  /.  int *pisComp
5300: 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20 69 66  lete, /* True if
5310: 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61   the only wildca
5320: 72 64 20 69 73 20 25 20 69 6e 20 74 68 65 20 6c  rd is % in the l
5330: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 2a 2f  ast character */
5340: 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65 20  .  int *pnoCase 
5350: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5360: 75 70 70 65 72 63 61 73 65 20 69 73 20 65 71 75  uppercase is equ
5370: 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 72  ivalent to lower
5380: 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  case */.){.  con
5390: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 20  st char *z = 0; 
53a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e          /* Strin
53b0: 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b 45  g on RHS of LIKE
53c0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45   operator */.  E
53d0: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c  xpr *pRight, *pL
53e0: 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 52 69 67  eft;      /* Rig
53f0: 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 7a 65  ht and left size
5400: 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f   of LIKE operato
5410: 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  r */.  ExprList 
5420: 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
5430: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70 65    /* List of ope
5440: 72 61 6e 64 73 20 74 6f 20 74 68 65 20 4c 49 4b  rands to the LIK
5450: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
5460: 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20 20  int c;          
5470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
5480: 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a  e character in z
5490: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  [] */.  int cnt;
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
54c0: 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65  non-wildcard pre
54d0: 66 69 78 20 63 68 61 72 61 63 74 65 72 73 20 2a  fix characters *
54e0: 2f 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 20  /.  char wc[3]; 
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5500: 2a 20 57 69 6c 64 63 61 72 64 20 63 68 61 72 61  * Wildcard chara
5510: 63 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  cters */.  sqlit
5520: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5530: 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
5540: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
5550: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
5560: 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pVal = 0;.  int
5570: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
5580: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64          /* Opcod
5590: 65 20 6f 66 20 70 52 69 67 68 74 20 2a 2f 0a 0a  e of pRight */..
55a0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73    if( !sqlite3Is
55b0: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c  LikeFunction(db,
55c0: 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65 2c   pExpr, pnoCase,
55d0: 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75   wc) ){.    retu
55e0: 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66  rn 0;.  }.#ifdef
55f0: 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a 20   SQLITE_EBCDIC. 
5600: 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29 20   if( *pnoCase ) 
5610: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
5620: 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72  .  pList = pExpr
5630: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70 4c 65  ->x.pList;.  pLe
5640: 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d  ft = pList->a[1]
5650: 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4c  .pExpr;.  if( pL
5660: 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  eft->op!=TK_COLU
5670: 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65  MN .   || sqlite
5680: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c  3ExprAffinity(pL
5690: 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46 46  eft)!=SQLITE_AFF
56a0: 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20 49 73 56  _TEXT .   || IsV
56b0: 69 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70 54  irtual(pLeft->pT
56c0: 61 62 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ab).  ){.    /* 
56d0: 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39 34  IMP: R-02065-494
56e0: 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  65 The left-hand
56f0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49 4b   side of the LIK
5700: 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74  E or GLOB operat
5710: 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  or must.    ** b
5720: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  e the name of an
5730: 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20   indexed column 
5740: 77 69 74 68 20 54 45 58 54 20 61 66 66 69 6e 69  with TEXT affini
5750: 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ty. */.    retur
5760: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 0;.  }.  asser
5770: 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  t( pLeft->iColum
5780: 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42 65  n!=(-1) ); /* Be
5790: 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72 20  cause IPK never 
57a0: 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f 0a  has AFF_TEXT */.
57b0: 0a 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69  .  pRight = sqli
57c0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
57d0: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  te(pList->a[0].p
57e0: 45 78 70 72 29 3b 0a 20 20 6f 70 20 3d 20 70 52  Expr);.  op = pR
57f0: 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  ight->op;.  if( 
5800: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
5810: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52 65  ){.    Vdbe *pRe
5820: 70 72 65 70 61 72 65 20 3d 20 70 50 61 72 73 65  prepare = pParse
5830: 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20  ->pReprepare;.  
5840: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69    int iCol = pRi
5850: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  ght->iColumn;.  
5860: 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
5870: 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75  VdbeGetBoundValu
5880: 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69 43  e(pReprepare, iC
5890: 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ol, SQLITE_AFF_N
58a0: 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56  ONE);.    if( pV
58b0: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61  al && sqlite3_va
58c0: 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d  lue_type(pVal)==
58d0: 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
58e0: 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a       z = (char *
58f0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
5900: 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d  ext(pVal);.    }
5910: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5920: 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73  SetVarmask(pPars
5930: 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b  e->pVdbe, iCol);
5940: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69  .    assert( pRi
5950: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49  ght->op==TK_VARI
5960: 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e  ABLE || pRight->
5970: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
5980: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  );.  }else if( o
5990: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p==TK_STRING ){.
59a0: 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e      z = pRight->
59b0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20  u.zToken;.  }.  
59c0: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74  if( z ){.    cnt
59d0: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
59e0: 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26   (c=z[cnt])!=0 &
59f0: 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21  & c!=wc[0] && c!
5a00: 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b  =wc[1] && c!=wc[
5a10: 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  2] ){.      cnt+
5a20: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
5a30: 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d   cnt!=0 && 255!=
5a40: 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a  (u8)z[cnt-1] ){.
5a50: 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72 65        Expr *pPre
5a60: 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43  fix;.      *pisC
5a70: 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b  omplete = c==wc[
5a80: 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d  0] && z[cnt+1]==
5a90: 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69 78  0;.      pPrefix
5aa0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
5ab0: 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29  b, TK_STRING, z)
5ac0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
5ad0: 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e 75  fix ) pPrefix->u
5ae0: 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30  .zToken[cnt] = 0
5af0: 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66 69  ;.      *ppPrefi
5b00: 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20 20  x = pPrefix;.   
5b10: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41     if( op==TK_VA
5b20: 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20  RIABLE ){.      
5b30: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
5b40: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20  se->pVdbe;.     
5b50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
5b60: 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69 67  tVarmask(v, pRig
5b70: 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ht->iColumn);.  
5b80: 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f        if( *pisCo
5b90: 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68 74  mplete && pRight
5ba0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b  ->u.zToken[1] ){
5bb0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
5bc0: 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65 20   the rhs of the 
5bd0: 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20  LIKE expression 
5be0: 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61  is a variable, a
5bf0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  nd the current. 
5c00: 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75           ** valu
5c10: 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c  e of the variabl
5c20: 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73  e means there is
5c30: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f   no need to invo
5c40: 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20  ke the LIKE.    
5c50: 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
5c60: 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61  n, then no OP_Va
5c70: 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61  riable will be a
5c80: 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67  dded to the prog
5c90: 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ram..          *
5ca0: 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70 72  * This causes pr
5cb0: 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73  oblems for the s
5cc0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
5cd0: 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20  meter_name().   
5ce0: 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54         ** API. T
5cf0: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
5d00: 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20  em, add a dummy 
5d10: 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65  OP_Variable here
5d20: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a  ..          */ .
5d30: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
5d40: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
5d50: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
5d60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5d70: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
5d80: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31  arse, pRight, r1
5d90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
5da0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
5db0: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
5dc0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
5dd0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
5de0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5df0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
5e00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5e10: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
5e20: 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20       z = 0;.    
5e30: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
5e40: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
5e50: 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29  .  return (z!=0)
5e60: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
5e70: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
5e80: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
5e90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5ea0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
5eb0: 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  E./*.** Check to
5ec0: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
5ed0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
5ee0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
5ef0: 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
5f00: 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a   MATCH expr.**.*
5f10: 2a 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20  * If it is then 
5f20: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66  return TRUE.  If
5f30: 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c   not, return FAL
5f40: 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
5f50: 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  t isMatchOfColum
5f60: 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  n(.  Expr *pExpr
5f70: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68        /* Test th
5f80: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
5f90: 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
5fa0: 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45  pList;..  if( pE
5fb0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43  xpr->op!=TK_FUNC
5fc0: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  TION ){.    retu
5fd0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
5fe0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
5ff0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
6000: 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20  match")!=0 ){.  
6010: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6020: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
6030: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  >x.pList;.  if( 
6040: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20  pList->nExpr!=2 
6050: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6060: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
6070: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[1].pExpr->op
6080: 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b   != TK_COLUMN ){
6090: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
60a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
60b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
60c0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
60d0: 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  BLE */../*.** If
60e0: 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65   the pBase expre
60f0: 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64  ssion originated
6100: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
6110: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a  ING clause of.**
6120: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72   a join, then tr
6130: 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f  ansfer the appro
6140: 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20  priate markings 
6150: 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e  over to derived.
6160: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6170: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
6180: 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69  ings(Expr *pDeri
6190: 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65  ved, Expr *pBase
61a0: 29 7b 0a 20 20 69 66 28 20 70 44 65 72 69 76 65  ){.  if( pDerive
61b0: 64 20 29 7b 0a 20 20 20 20 70 44 65 72 69 76 65  d ){.    pDerive
61c0: 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61 73  d->flags |= pBas
61d0: 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72  e->flags & EP_Fr
61e0: 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70 44 65 72  omJoin;.    pDer
61f0: 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  ived->iRightJoin
6200: 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69  Table = pBase->i
6210: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
6220: 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69    }.}..#if !defi
6230: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6240: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
6250: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
6260: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
6270: 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  Y)./*.** Analyze
6280: 20 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e   a term that con
6290: 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20  sists of two or 
62a0: 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  more OR-connecte
62b0: 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20  d.** subterms.  
62c0: 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  So in:.**.**    
62d0: 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35   ... WHERE  (a=5
62e0: 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d  ) AND (b=7 OR c=
62f0: 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28  9 OR d=13) AND (
6300: 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20  d=13).**        
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e    ^^^^^^^^^^^^^^
6330: 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69  ^^^^^^.**.** Thi
6340: 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a  s routine analyz
6350: 65 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73  es terms such as
6360: 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d   the middle term
6370: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78   in the above ex
6380: 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72  ample..** A Wher
6390: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  eOrTerm object i
63a0: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61  s computed and a
63b0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
63c0: 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61  erm under.** ana
63d0: 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73  lysis, regardles
63e0: 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65  s of the outcome
63f0: 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73   of the analysis
6400: 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20  .  Hence:.**.** 
6410: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74      WhereTerm.wt
6420: 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d  Flags   |=  TERM
6430: 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57  _ORINFO.**     W
6440: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
6450: 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63  fo  =  a dynamic
6460: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
6470: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
6480: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  t.**.** The term
6490: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
64a0: 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72  must have two or
64b0: 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e   more of OR-conn
64c0: 65 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a  ected subterms..
64d0: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74  ** A single subt
64e0: 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73  erm might be a s
64f0: 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63  et of AND-connec
6500: 74 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73  ted sub-subterms
6510: 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66  ..** Examples of
6520: 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61   terms under ana
6530: 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lysis:.**.**    
6540: 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (A)     t1.x=t2
6550: 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20  .y OR t1.x=t2.z 
6560: 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31  OR t1.y=15 OR t1
6570: 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20  .z=t3.a+5.**    
6580: 20 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31   (B)     x=expr1
6590: 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78   OR expr2=x OR x
65a0: 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43  =expr3.**     (C
65b0: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
65c0: 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e  OR (t1.x=t2.z AN
65d0: 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20  D t1.y=15).**   
65e0: 20 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72    (D)     x=expr
65f0: 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79  1 OR (y>11 AND y
6600: 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27  <22 AND z LIKE '
6610: 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20  *hello*').**    
6620: 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20   (E)     (p.a=1 
6630: 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e  AND q.b=2 AND r.
6640: 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41  c=3) OR (p.x=4 A
6650: 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a  ND q.y=5 AND r.z
6660: 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31  =6).**.** CASE 1
6670: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
6680: 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  ubterms are of t
6690: 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72  he form T.C=expr
66a0: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
66b0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64   column of C and
66c0: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
66d0: 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69  le T (as shown i
66e0: 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76  n example B abov
66f0: 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e) then create a
6700: 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20   new virtual.** 
6710: 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20  term that is an 
6720: 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78  equivalent IN ex
6730: 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74  pression.  In ot
6740: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
6750: 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20  e term.** being 
6760: 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a  analyzed is:.**.
6770: 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72  **      x = expr
6780: 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78  1  OR  expr2 = x
6790: 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a    OR  x = expr3.
67a0: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  **.** then creat
67b0: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  e a new virtual 
67c0: 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a  term like this:.
67d0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
67e0: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
67f0: 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32  r3).**.** CASE 2
6800: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
6810: 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65  ubterms are inde
6820: 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c  xable by a singl
6830: 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20  e table T, then 
6840: 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  set.**.**     Wh
6850: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
6860: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  r              =
6870: 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57    WO_OR.**     W
6880: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
6890: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c  fo->indexable  |
68a0: 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  =  the cursor nu
68b0: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54  mber for table T
68c0: 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  .**.** A subterm
68d0: 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20   is "indexable" 
68e0: 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20  if it is of the 
68f0: 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70  form.** "T.C <op
6900: 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20  > <expr>" where 
6910: 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  C is any column 
6920: 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a  of table T and .
6930: 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  ** <op> is one o
6940: 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22  f "=", "<", "<="
6950: 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53  , ">", ">=", "IS
6960: 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e   NULL", or "IN".
6970: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
6980: 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20   also indexable 
6990: 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20  if it is an AND 
69a0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  of two or more.*
69b0: 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74  * subsubterms at
69c0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68   least one of wh
69d0: 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ich is indexable
69e0: 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44  .  Indexable AND
69f0: 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61   .** subterms ha
6a00: 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74  ve their eOperat
6a10: 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44  or set to WO_AND
6a20: 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a   and they have.*
6a30: 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74  * u.pAndInfo set
6a40: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
6a50: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
6a60: 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e  eAndTerm object.
6a70: 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74  .**.** From anot
6a80: 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65  her point of vie
6a90: 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d  w, "indexable" m
6aa0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75  eans that the su
6ab0: 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70  bterm could.** p
6ac0: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73  otentially be us
6ad0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
6ae0: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
6af0: 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e  te index exists.
6b00: 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69  .** This analysi
6b10: 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69  s does not consi
6b20: 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  der whether or n
6b30: 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69  ot the index exi
6b40: 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20  sts; that.** is 
6b50: 64 65 63 69 64 65 64 20 65 6c 73 65 77 68 65 72  decided elsewher
6b60: 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69  e.  This analysi
6b70: 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20  s only looks at 
6b80: 77 68 65 74 68 65 72 20 73 75 62 74 65 72 6d 73  whether subterms
6b90: 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
6ba0: 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69  for indexing exi
6bb0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78  st..**.** All ex
6bc0: 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68  amples A through
6bd0: 20 45 20 61 62 6f 76 65 20 73 61 74 69 73 66 79   E above satisfy
6be0: 20 63 61 73 65 20 32 2e 20 20 42 75 74 20 69 66   case 2.  But if
6bf0: 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20   a term.** also 
6c00: 73 61 74 69 73 66 69 65 73 20 63 61 73 65 20 31  satisfies case 1
6c10: 20 28 73 75 63 68 20 61 73 20 42 29 20 77 65 20   (such as B) we 
6c20: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 70  know that the op
6c30: 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20  timizer will.** 
6c40: 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 63 61  always prefer ca
6c50: 73 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61 74  se 1, so in that
6c60: 20 63 61 73 65 20 77 65 20 70 72 65 74 65 6e 64   case we pretend
6c70: 20 74 68 61 74 20 63 61 73 65 20 32 20 69 73 20   that case 2 is 
6c80: 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65 64  not.** satisfied
6c90: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74  ..**.** It might
6ca0: 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
6cb0: 74 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65  t multiple table
6cc0: 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e  s are indexable.
6cd0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a    For example,.*
6ce0: 2a 20 28 45 29 20 61 62 6f 76 65 20 69 73 20 69  * (E) above is i
6cf0: 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c  ndexable on tabl
6d00: 65 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a  es P, Q, and R..
6d10: 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61 74  **.** Terms that
6d20: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 20   satisfy case 2 
6d30: 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66  are candidates f
6d40: 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69  or lookup by usi
6d50: 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69  ng.** separate i
6d60: 6e 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20 72  ndices to find r
6d70: 6f 77 69 64 73 20 66 6f 72 20 65 61 63 68 20 73  owids for each s
6d80: 75 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f  ubterm and compo
6d90: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f  sing.** the unio
6da0: 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73 20  n of all rowids 
6db0: 75 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f  using a RowSet o
6dc0: 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73 20  bject.  This is 
6dd0: 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62  similar.** to "b
6de0: 69 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20 69  itmap indices" i
6df0: 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  n other database
6e00: 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20   engines..**.** 
6e10: 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a  OTHERWISE:.**.**
6e20: 20 49 66 20 6e 65 69 74 68 65 72 20 63 61 73 65   If neither case
6e30: 20 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61 70   1 nor case 2 ap
6e40: 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65 20  ply, then leave 
6e50: 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73 65  the eOperator se
6e60: 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54  t to.** zero.  T
6e70: 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  his term is not 
6e80: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72 63  useful for searc
6e90: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
6ea0: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54  d exprAnalyzeOrT
6eb0: 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  erm(.  SrcList *
6ec0: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
6ed0: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
6ee0: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
6ef0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
6f00: 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65     /* the comple
6f10: 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  te WHERE clause 
6f20: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d  */.  int idxTerm
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6f40: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 4f  * Index of the O
6f50: 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  R-term to be ana
6f60: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68  lyzed */.){.  Wh
6f70: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
6f80: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 20  = pWC->pWInfo;  
6f90: 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
6fa0: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
6fb0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
6fc0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
6fd0: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20  Info->pParse;   
6fe0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
6ff0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
7000: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7010: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  e->db;          
7020: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
7030: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
7040: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
7050: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
7060: 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20  erm];    /* The 
7070: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
7080: 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  zed */.  Expr *p
7090: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
70a0: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
70b0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
70c0: 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a  on of the term *
70d0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7100: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
7110: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
7120: 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20 42  OrWc;       /* B
7130: 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d 20  reakup of pTerm 
7140: 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f  into subterms */
7150: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f  .  WhereTerm *pO
7160: 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20  rTerm;       /* 
7170: 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68 69  A Sub-term withi
7180: 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20  n the pOrWc */. 
7190: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f   WhereOrInfo *pO
71a0: 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64  rInfo;     /* Ad
71b0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
71c0: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
71d0: 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20  with pTerm */.  
71e0: 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e  Bitmask chngToIN
71f0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
7200: 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73  les that might s
7210: 61 74 69 73 66 79 20 63 61 73 65 20 31 20 2a 2f  atisfy case 1 */
7220: 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78  .  Bitmask index
7230: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  able;        /* 
7240: 54 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20  Tables that are 
7250: 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69 73  indexable, satis
7260: 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a  fying case 2 */.
7270: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b  .  /*.  ** Break
7280: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69   the OR clause i
7290: 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61 74 65  nto its separate
72a0: 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65 20   subterms.  The 
72b0: 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20 2a  subterms are.  *
72c0: 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57 68  * stored in a Wh
72d0: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
72e0: 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77  ure containing w
72f0: 69 74 68 69 6e 20 74 68 65 20 57 68 65 72 65 4f  ithin the WhereO
7300: 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63  rInfo.  ** objec
7310: 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63 68  t that is attach
7320: 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ed to the origin
7330: 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72  al OR clause ter
7340: 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  m..  */.  assert
7350: 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
7360: 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49  s & (TERM_DYNAMI
7370: 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45  C|TERM_ORINFO|TE
7380: 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20  RM_ANDINFO))==0 
7390: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
73a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  pr->op==TK_OR );
73b0: 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  .  pTerm->u.pOrI
73c0: 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20  nfo = pOrInfo = 
73d0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
73e0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
73f0: 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28  pOrInfo));.  if(
7400: 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65   pOrInfo==0 ) re
7410: 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77  turn;.  pTerm->w
7420: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f  tFlags |= TERM_O
7430: 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d  RINFO;.  pOrWc =
7440: 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20   &pOrInfo->wc;. 
7450: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
7460: 28 70 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29 3b  (pOrWc, pWInfo);
7470: 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f  .  whereSplit(pO
7480: 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f  rWc, pExpr, TK_O
7490: 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a  R);.  exprAnalyz
74a0: 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63  eAll(pSrc, pOrWc
74b0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
74c0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
74d0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  rn;.  assert( pO
74e0: 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b  rWc->nTerm>=2 );
74f0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70  ..  /*.  ** Comp
7500: 75 74 65 20 74 68 65 20 73 65 74 20 6f 66 20 74  ute the set of t
7510: 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74  ables that might
7520: 20 73 61 74 69 73 66 79 20 63 61 73 65 73 20 31   satisfy cases 1
7530: 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e   or 2..  */.  in
7540: 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d  dexable = ~(Bitm
7550: 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49  ask)0;.  chngToI
7560: 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  N = ~(Bitmask)0;
7570: 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e  .  for(i=pOrWc->
7580: 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d  nTerm-1, pOrTerm
7590: 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20  =pOrWc->a; i>=0 
75a0: 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d  && indexable; i-
75b0: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
75c0: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
75d0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
75e0: 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  SINGLE)==0 ){.  
75f0: 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f      WhereAndInfo
7600: 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20   *pAndInfo;.    
7610: 20 20 61 73 73 65 72 74 28 20 28 70 4f 72 54 65    assert( (pOrTe
7620: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
7630: 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d  ERM_ANDINFO|TERM
7640: 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a  _ORINFO))==0 );.
7650: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d        chngToIN =
7660: 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e   0;.      pAndIn
7670: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
7680: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
7690: 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a  of(*pAndInfo));.
76a0: 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 49 6e        if( pAndIn
76b0: 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68  fo ){.        Wh
76c0: 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57  ereClause *pAndW
76d0: 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  C;.        Where
76e0: 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a  Term *pAndTerm;.
76f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
7700: 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
7710: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 0;.        pO
7720: 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66  rTerm->u.pAndInf
7730: 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20  o = pAndInfo;.  
7740: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
7750: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41  tFlags |= TERM_A
7760: 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20  NDINFO;.        
7770: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
7780: 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20  or = WO_AND;.   
7790: 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26 70       pAndWC = &p
77a0: 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  AndInfo->wc;.   
77b0: 20 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65       whereClause
77c0: 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43  Init(pAndWC, pWC
77d0: 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  ->pWInfo);.     
77e0: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 41     whereSplit(pA
77f0: 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70  ndWC, pOrTerm->p
7800: 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20  Expr, TK_AND);. 
7810: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
7820: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64  zeAll(pSrc, pAnd
7830: 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e  WC);.        pAn
7840: 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57  dWC->pOuter = pW
7850: 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  C;.        testc
7860: 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ase( db->mallocF
7870: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
7880: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
7890: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
78a0: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e      for(j=0, pAn
78b0: 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b  dTerm=pAndWC->a;
78c0: 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d   j<pAndWC->nTerm
78d0: 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b  ; j++, pAndTerm+
78e0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
78f0: 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d  assert( pAndTerm
7900: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
7910: 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77         if( allow
7920: 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70  edOp(pAndTerm->p
7930: 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20  Expr->op) ){.   
7940: 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20             b |= 
7950: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
7960: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64 54  >sMaskSet, pAndT
7970: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
7980: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
7990: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
79a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e      }.        in
79b0: 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20  dexable &= b;.  
79c0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
79d0: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  if( pOrTerm->wtF
79e0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
79f0: 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ED ){.      /* S
7a00: 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66 6f  kip this term fo
7a10: 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69 73  r now.  We revis
7a20: 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70 72  it it when we pr
7a30: 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20 20  ocess the.      
7a40: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
7a50: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74 65   TERM_VIRTUAL te
7a60: 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  rm */.    }else{
7a70: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62  .      Bitmask b
7a80: 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74 4d  ;.      b = getM
7a90: 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
7aa0: 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e  skSet, pOrTerm->
7ab0: 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20  leftCursor);.   
7ac0: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
7ad0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
7ae0: 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20  IRTUAL ){.      
7af0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74    WhereTerm *pOt
7b00: 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b  her = &pOrWc->a[
7b10: 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  pOrTerm->iParent
7b20: 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20  ];.        b |= 
7b30: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
7b40: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68 65  >sMaskSet, pOthe
7b50: 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  r->leftCursor);.
7b60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
7b70: 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20  dexable &= b;.  
7b80: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
7b90: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
7ba0: 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _EQ)==0 ){.     
7bb0: 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b     chngToIN = 0;
7bc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7bd0: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26        chngToIN &
7be0: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
7bf0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
7c00: 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65 74  * Record the set
7c10: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
7c20: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20  satisfy case 2. 
7c30: 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20 62   The set might b
7c40: 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20  e.  ** empty..  
7c50: 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e  */.  pOrInfo->in
7c60: 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61  dexable = indexa
7c70: 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f  ble;.  pTerm->eO
7c80: 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61  perator = indexa
7c90: 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f  ble==0 ? 0 : WO_
7ca0: 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63  OR;..  /*.  ** c
7cb0: 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20  hngToIN holds a 
7cc0: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
7cd0: 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73  at *might* satis
7ce0: 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a  fy case 1.  But.
7cf0: 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20    ** we have to 
7d00: 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  do some addition
7d10: 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73  al checking to s
7d20: 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65 61  ee if case 1 rea
7d30: 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69  lly.  ** is sati
7d40: 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  sfied..  **.  **
7d50: 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68   chngToIN will h
7d60: 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c  old either 0, 1,
7d70: 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68 65   or 2 bits.  The
7d80: 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e   0-bit case mean
7d90: 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72  s.  ** that ther
7da0: 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c  e is no possibil
7db0: 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d  ity of transform
7dc0: 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73  ing the OR claus
7dd0: 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49  e into an.  ** I
7de0: 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75  N operator becau
7df0: 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74  se one or more t
7e00: 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63  erms in the OR c
7e10: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20  lause contain.  
7e20: 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ** something oth
7e30: 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20  er than == on a 
7e40: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69  column in the si
7e50: 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ngle table.  The
7e60: 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65   1-bit.  ** case
7e70: 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65 72   means that ever
7e80: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  y term of the OR
7e90: 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68   clause is of th
7ea0: 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62  e form.  ** "tab
7eb0: 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20  le.column=expr" 
7ec0: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
7ed0: 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20  table.  The one 
7ee0: 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74 0a  bit that is set.
7ef0: 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73    ** will corres
7f00: 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d  pond to the comm
7f10: 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74  on table.  We st
7f20: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63  ill need to chec
7f30: 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  k to make.  ** s
7f40: 75 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  ure the same col
7f50: 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61  umn is used on a
7f60: 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32  ll terms.  The 2
7f70: 2d 62 69 74 20 63 61 73 65 20 69 73 20 77 68 65  -bit case is whe
7f80: 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74  n.  ** the all t
7f90: 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20  erms are of the 
7fa0: 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c  form "table1.col
7fb0: 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d  umn=table2.colum
7fc0: 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67  n".  It.  ** mig
7fd0: 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ht be possible t
7fe0: 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65  o form an IN ope
7ff0: 72 61 74 6f 72 20 77 69 74 68 20 65 69 74 68 65  rator with eithe
8000: 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a  r table1.column.
8010: 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63    ** or table2.c
8020: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53  olumn as the LHS
8030: 20 69 66 20 65 69 74 68 65 72 20 69 73 20 63 6f   if either is co
8040: 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65  mmon to every te
8050: 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f  rm of.  ** the O
8060: 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  R clause..  **. 
8070: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65   ** Note that te
8080: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rms of the form 
8090: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74  "table.column1=t
80a0: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74  able.column2" (t
80b0: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62  he.  ** same tab
80c0: 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73  le on both sizes
80d0: 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e   of the ==) cann
80e0: 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e  ot be optimized.
80f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67  .  */.  if( chng
8100: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ToIN ){.    int 
8110: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
8120: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
8130: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
8140: 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a  to IN is valid *
8150: 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d  /.    int iColum
8160: 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  n = -1;         
8170: 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  /* Column index 
8180: 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65  on lhs of IN ope
8190: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74  rator */.    int
81a0: 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20   iCursor = -1;  
81b0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
81c0: 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f  cursor common to
81d0: 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20   all terms */.  
81e0: 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20    int j = 0;    
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
8200: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
8210: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
8220: 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  r a table and co
8230: 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72  lumn that appear
8240: 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72  s on one side or
8250: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65   the.    ** othe
8260: 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72  r of the == oper
8270: 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75  ator in every su
8280: 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62  bterm.  That tab
8290: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20  le and column.  
82a0: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63    ** will be rec
82b0: 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72  orded in iCursor
82c0: 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54   and iColumn.  T
82d0: 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  here might not b
82e0: 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63  e any.    ** suc
82f0: 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  h table and colu
8300: 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e  mn.  Set okToChn
8310: 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72  gToIN if an appr
8320: 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20  opriate table.  
8330: 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20    ** and column 
8340: 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61  is found but lea
8350: 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  ve okToChngToIN 
8360: 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75  false if not fou
8370: 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  nd..    */.    f
8380: 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21  or(j=0; j<2 && !
8390: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b  okToChngToIN; j+
83a0: 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72  +){.      pOrTer
83b0: 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20  m = pOrWc->a;.  
83c0: 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d      for(i=pOrWc-
83d0: 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  >nTerm-1; i>=0; 
83e0: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
83f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8400: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
8410: 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
8420: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
8430: 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d  wtFlags &= ~TERM
8440: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
8450: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
8460: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72  tCursor==iCursor
8470: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
8480: 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d 62   This is the 2-b
8490: 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20 61  it case and we a
84a0: 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  re on the second
84b0: 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20   iteration and. 
84c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72           ** curr
84d0: 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d  ent term is from
84e0: 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
84f0: 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74  tion.  So skip t
8500: 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20  his term. */.   
8510: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
8520: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==1 );.         
8530: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8540: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
8550: 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74   (chngToIN & get
8560: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
8570: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
8580: 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30  >leftCursor))==0
8590: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
85a0: 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20   This term must 
85b0: 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74  be of the form t
85c0: 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20  1.a==t2.b where 
85d0: 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20  t2 is in the.   
85e0: 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f         ** chngTo
85f0: 49 4e 20 73 65 74 20 62 75 74 20 74 31 20 69 73  IN set but t1 is
8600: 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d   not.  This term
8610: 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20   will be either 
8620: 70 72 65 63 65 64 65 64 0a 20 20 20 20 20 20 20  preceded.       
8630: 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64     ** or follwed
8640: 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20   by an inverted 
8650: 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61  copy (t2.b==t1.a
8660: 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74 65  ).  Skip this te
8670: 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rm .          **
8680: 20 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76   and use its inv
8690: 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  ersion. */.     
86a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
86b0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
86c0: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b  & TERM_COPIED );
86d0: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
86e0: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
86f0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
8700: 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  TUAL );.        
8710: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
8720: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
8730: 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56  RM_COPIED|TERM_V
8740: 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20  IRTUAL) );.     
8750: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
8760: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8770: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65   iColumn = pOrTe
8780: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
8790: 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72 73 6f  ;.        iCurso
87a0: 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  r = pOrTerm->lef
87b0: 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  tCursor;.       
87c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
87d0: 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b        if( i<0 ){
87e0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63  .        /* No c
87f0: 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63  andidate table+c
8800: 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e  olumn was found.
8810: 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20    This can only 
8820: 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  occur.        **
8830: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
8840: 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  teration */.    
8850: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31      assert( j==1
8860: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
8870: 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
8880: 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20 20  (chngToIN) );.  
8890: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 68        assert( ch
88a0: 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28  ngToIN==getMask(
88b0: 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
88c0: 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a 20  t, iCursor) );. 
88d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
88e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
88f0: 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20  case( j==1 );.. 
8900: 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
8910: 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61 74  found a candidat
8920: 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  e table and colu
8930: 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  mn.  Check to se
8940: 65 20 69 66 20 74 68 61 74 0a 20 20 20 20 20 20  e if that.      
8950: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ** table and col
8960: 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  umn is common to
8970: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
8980: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f 0a  he OR clause */.
8990: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
89a0: 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f  IN = 1;.      fo
89b0: 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f  r(; i>=0 && okTo
89c0: 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70  ChngToIN; i--, p
89d0: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
89e0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
89f0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
8a00: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
8a10: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
8a20: 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f  ftCursor!=iCurso
8a30: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
8a40: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
8a50: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
8a60: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
8a70: 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  ( pOrTerm->u.lef
8a80: 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  tColumn!=iColumn
8a90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b   ){.          ok
8aa0: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
8ab0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8ac0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66           int aff
8ad0: 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a  Left, affRight;.
8ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
8af0: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
8b00: 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f  ide is also a co
8b10: 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61  lumn, then the a
8b20: 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20  ffinities.      
8b30: 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72      ** of both r
8b40: 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69  ight and left si
8b50: 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68  des must be such
8b60: 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20   that no type.  
8b70: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65          ** conve
8b80: 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69  rsions are requi
8b90: 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74  red on the right
8ba0: 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39  .  (Ticket #2249
8bb0: 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ).          */. 
8bc0: 20 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68           affRigh
8bd0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
8be0: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
8bf0: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  >pExpr->pRight);
8c00: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65  .          affLe
8c10: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
8c20: 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d  Affinity(pOrTerm
8c30: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  ->pExpr->pLeft);
8c40: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
8c50: 66 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66  ffRight!=0 && af
8c60: 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20  fRight!=affLeft 
8c70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ){.            o
8c80: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
8c90: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
8ca0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  {.            pO
8cb0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  rTerm->wtFlags |
8cc0: 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20  = TERM_OR_OK;.  
8cd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8ce0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8cf0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
8d00: 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e  s point, okToChn
8d10: 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66  gToIN is true if
8d20: 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20   original pTerm 
8d30: 73 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a  satisfies.    **
8d40: 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61   case 1.  In tha
8d50: 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63  t case, construc
8d60: 74 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  t a new virtual 
8d70: 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20  term that is .  
8d80: 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65    ** pTerm conve
8d90: 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20  rted into an IN 
8da0: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f  operator..    */
8db0: 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e  .    if( okToChn
8dc0: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45  gToIN ){.      E
8dd0: 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20  xpr *pDup;      
8de0: 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73        /* A trans
8df0: 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65  ient duplicate e
8e00: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
8e10: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
8e20: 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  st = 0;   /* The
8e30: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
8e40: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
8e50: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30   Expr *pLeft = 0
8e60: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;       /* The L
8e70: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
8e80: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45  rator */.      E
8e90: 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  xpr *pNew;      
8ea0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
8eb0: 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f  plete IN operato
8ec0: 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  r */..      for(
8ed0: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
8ee0: 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d  , pOrTerm=pOrWc-
8ef0: 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  >a; i>=0; i--, p
8f00: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
8f10: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
8f20: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
8f30: 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74  OR_OK)==0 ) cont
8f40: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73  inue;.        as
8f50: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
8f60: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
8f70: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
8f80: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  rt( pOrTerm->lef
8f90: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72  tCursor==iCursor
8fa0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
8fb0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  rt( pOrTerm->u.l
8fc0: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
8fd0: 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  mn );.        pD
8fe0: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
8ff0: 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d  Dup(db, pOrTerm-
9000: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
9010: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73  0);.        pLis
9020: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
9030: 69 73 74 41 70 70 65 6e 64 28 70 57 49 6e 66 6f  istAppend(pWInfo
9040: 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  ->pParse, pList,
9050: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20   pDup);.        
9060: 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d  pLeft = pOrTerm-
9070: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  >pExpr->pLeft;. 
9080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
9090: 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b  ert( pLeft!=0 );
90a0: 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71  .      pDup = sq
90b0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
90c0: 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20   pLeft, 0);.    
90d0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
90e0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
90f0: 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29  _IN, pDup, 0, 0)
9100: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
9110: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
9120: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  idxNew;.        
9130: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
9140: 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72  ings(pNew, pExpr
9150: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
9160: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
9170: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
9180: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
9190: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74     pNew->x.pList
91a0: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
91b0: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
91c0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
91d0: 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52  , pNew, TERM_VIR
91e0: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
91f0: 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  C);.        test
9200: 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
9210: 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41  );.        exprA
9220: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
9230: 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20  , idxNew);.     
9240: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
9250: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
9260: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
9270: 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  ew].iParent = id
9280: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70  xTerm;.        p
9290: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
92a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
92b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
92c0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
92d0: 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d   pList);.      }
92e0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f  .      pTerm->eO
92f0: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f  perator = WO_NOO
9300: 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74 72  P;  /* case 1 tr
9310: 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f 0a 20  umps case 2 */. 
9320: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
9330: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
9340: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
9350: 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49  N && !SQLITE_OMI
9360: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f  T_SUBQUERY */../
9370: 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74  *.** The input t
9380: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
9390: 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73  s an WhereTerm s
93a0: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e  tructure with on
93b0: 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72  ly the.** "pExpr
93c0: 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69  " field filled i
93d0: 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  n.  The job of t
93e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
93f0: 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a  o analyze the.**
9400: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61   subexpression a
9410: 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20  nd populate all 
9420: 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73  the other fields
9430: 20 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72   of the WhereTer
9440: 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a  m.** structure..
9450: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
9460: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
9470: 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c  e form "<expr> <
9480: 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63  op> X" it gets c
9490: 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68  ommuted.** to th
94a0: 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20  e standard form 
94b0: 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  of "X <op> <expr
94c0: 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  >"..**.** If the
94d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
94e0: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
94f0: 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74 68  p> Y" where both
9500: 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20   X and Y are.** 
9510: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68  columns, then th
9520: 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65  e original expre
9530: 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67  ssion is unchang
9540: 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72  ed and a new vir
9550: 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20  tual.** term of 
9560: 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e  the form "Y <op>
9570: 20 58 22 20 69 73 20 61 64 64 65 64 20 74 6f 20   X" is added to 
9580: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
9590: 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64   and.** analyzed
95a0: 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68   separately.  Th
95b0: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20  e original term 
95c0: 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54  is marked with T
95d0: 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e  ERM_COPIED.** an
95e0: 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69  d the new term i
95f0: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45  s marked with TE
9600: 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61  RM_DYNAMIC (beca
9610: 75 73 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a  use it's pExpr.*
9620: 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  * needs to be fr
9630: 65 65 64 20 77 69 74 68 20 74 68 65 20 57 68 65  eed with the Whe
9640: 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45  reClause) and TE
9650: 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61  RM_VIRTUAL (beca
9660: 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63  use it.** is a c
9670: 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20  ommuted copy of 
9680: 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20  a prior term.)  
9690: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
96a0: 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a  m has nChild=1.*
96b0: 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68  * and the copy h
96c0: 61 73 20 69 64 78 50 61 72 65 6e 74 20 73 65 74  as idxParent set
96d0: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
96e0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
96f0: 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rm..*/.static vo
9700: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a  id exprAnalyze(.
9710: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
9720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
9730: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
9740: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
9750: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
9760: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
9770: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65  e */.  int idxTe
9780: 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
9790: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
97a0: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
97b0: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  yzed */.){.  Whe
97c0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
97d0: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 2f 2a   pWC->pWInfo; /*
97e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
97f0: 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74  ocessing context
9800: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
9810: 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
9820: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65         /* The te
9830: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
9840: 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  d */.  WhereMask
9850: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20  Set *pMaskSet;  
9860: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f          /* Set o
9870: 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61  f table index ma
9880: 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  sks */.  Expr *p
9890: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
98a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
98b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   expression to b
98c0: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  e analyzed */.  
98d0: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65  Bitmask prereqLe
98e0: 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ft;             
98f0: 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65   /* Prerequesite
9900: 73 20 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e  s of the pExpr->
9910: 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61  pLeft */.  Bitma
9920: 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20  sk prereqAll;   
9930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
9940: 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20  rerequesites of 
9950: 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61  pExpr */.  Bitma
9960: 73 6b 20 65 78 74 72 61 52 69 67 68 74 20 3d 20  sk extraRight = 
9970: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  0;          /* E
9980: 78 74 72 61 20 64 65 70 65 6e 64 65 6e 63 69 65  xtra dependencie
9990: 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a  s on LEFT JOIN *
99a0: 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 72 31 20  /.  Expr *pStr1 
99b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
99c0: 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c       /* RHS of L
99d0: 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f  IKE/GLOB operato
99e0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  r */.  int isCom
99f0: 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20  plete = 0;      
9a00: 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f          /* RHS o
9a10: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73  f LIKE/GLOB ends
9a20: 20 77 69 74 68 20 77 69 6c 64 63 61 72 64 20 2a   with wildcard *
9a30: 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d  /.  int noCase =
9a40: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
9a50: 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f       /* LIKE/GLO
9a60: 42 20 64 69 73 74 69 6e 67 75 69 73 68 65 73 20  B distinguishes 
9a70: 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  case */.  int op
9a80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9a90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
9aa0: 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f 72  p-level operator
9ab0: 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a  .  pExpr->op */.
9ac0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
9ad0: 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
9ae0: 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f  ;  /* Parsing co
9af0: 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
9b00: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9b10: 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  >db;        /* D
9b20: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
9b30: 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d  on */..  if( db-
9b40: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
9b50: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9b60: 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d  .  pTerm = &pWC-
9b70: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70  >a[idxTerm];.  p
9b80: 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66  MaskSet = &pWInf
9b90: 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 70  o->sMaskSet;.  p
9ba0: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
9bb0: 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  xpr;.  assert( p
9bc0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20  Expr->op!=TK_AS 
9bd0: 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
9be0: 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 70 72  _COLLATE );.  pr
9bf0: 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54  ereqLeft = exprT
9c00: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
9c10: 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  et, pExpr->pLeft
9c20: 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  );.  op = pExpr-
9c30: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
9c40: 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  K_IN ){.    asse
9c50: 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  rt( pExpr->pRigh
9c60: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  t==0 );.    if( 
9c70: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9c80: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
9c90: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 70 54  ect) ){.      pT
9ca0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
9cb0: 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62   = exprSelectTab
9cc0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
9cd0: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  , pExpr->x.pSele
9ce0: 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ct);.    }else{.
9cf0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65        pTerm->pre
9d00: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c  reqRight = exprL
9d10: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
9d20: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78  askSet, pExpr->x
9d30: 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
9d40: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
9d50: 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  K_ISNULL ){.    
9d60: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
9d70: 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ht = 0;.  }else{
9d80: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
9d90: 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 54 61  eqRight = exprTa
9da0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
9db0: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
9dc0: 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71 41  );.  }.  prereqA
9dd0: 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ll = exprTableUs
9de0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
9df0: 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70 72  xpr);.  if( Expr
9e00: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
9e10: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
9e20: 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 78  ){.    Bitmask x
9e30: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
9e40: 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67  Set, pExpr->iRig
9e50: 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20  htJoinTable);.  
9e60: 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78    prereqAll |= x
9e70: 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67 68 74  ;.    extraRight
9e80: 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63   = x-1;  /* ON c
9e90: 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79 20  lause terms may 
9ea0: 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68  not be used with
9eb0: 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20 20   an index.      
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c   ** on left tabl
9ee0: 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
9ef0: 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 20  .  Ticket #3015 
9f00: 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e  */.  }.  pTerm->
9f10: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72  prereqAll = prer
9f20: 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e  eqAll;.  pTerm->
9f30: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b  leftCursor = -1;
9f40: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
9f50: 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d  t = -1;.  pTerm-
9f60: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a  >eOperator = 0;.
9f70: 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28    if( allowedOp(
9f80: 6f 70 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20  op) ){.    Expr 
9f90: 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  *pLeft = sqlite3
9fa0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
9fb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
9fc0: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
9fd0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
9fe0: 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e  pCollate(pExpr->
9ff0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 75 31 36  pRight);.    u16
a000: 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65 72 6d   opMask = (pTerm
a010: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
a020: 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 3f  prereqLeft)==0 ?
a030: 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45 51 55   WO_ALL : WO_EQU
a040: 49 56 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66  IV;.    if( pLef
a050: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
a060: 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   ){.      pTerm-
a070: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
a080: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
a090: 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74     pTerm->u.left
a0a0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
a0b0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
a0c0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
a0d0: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f  = operatorMask(o
a0e0: 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20  p) & opMask;.   
a0f0: 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68   }.    if( pRigh
a100: 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d  t && pRight->op=
a110: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
a120: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
a130: 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20  New;.      Expr 
a140: 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 75 31 36  *pDup;.      u16
a150: 20 65 45 78 74 72 61 4f 70 20 3d 20 30 3b 20 20   eExtraOp = 0;  
a160: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
a170: 69 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e 65 4f  its for pNew->eO
a180: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
a190: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
a1a0: 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20  Cursor>=0 ){.   
a1b0: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b       int idxNew;
a1c0: 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20  .        pDup = 
a1d0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a1e0: 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
a1f0: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
a200: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
a210: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
a220: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44  xprDelete(db, pD
a230: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  up);.          r
a240: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
a250: 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20  .        idxNew 
a260: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
a270: 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54  ert(pWC, pDup, T
a280: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
a290: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
a2a0: 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30     if( idxNew==0
a2b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
a2c0: 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e     pNew = &pWC->
a2d0: 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
a2e0: 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74     pNew->iParent
a2f0: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
a300: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
a310: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
a320: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
a330: 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ild = 1;.       
a340: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
a350: 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
a360: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
a370: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20 20 20  r->op==TK_EQ.   
a380: 20 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61        && !ExprHa
a390: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
a3a0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
a3b0: 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69         && Optimi
a3c0: 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
a3d0: 2c 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69 74  , SQLITE_Transit
a3e0: 69 76 65 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ive).        ){.
a3f0: 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d            pTerm-
a400: 3e 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20 57 4f  >eOperator |= WO
a410: 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20  _EQUIV;.        
a420: 20 20 65 45 78 74 72 61 4f 70 20 3d 20 57 4f 5f    eExtraOp = WO_
a430: 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 7d  EQUIV;.        }
a440: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a450: 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 78        pDup = pEx
a460: 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  pr;.        pNew
a470: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
a480: 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d  }.      exprComm
a490: 75 74 65 28 70 50 61 72 73 65 2c 20 70 44 75 70  ute(pParse, pDup
a4a0: 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d  );.      pLeft =
a4b0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
a4c0: 43 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e 70 4c  Collate(pDup->pL
a4d0: 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  eft);.      pNew
a4e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
a4f0: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
a500: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74      pNew->u.left
a510: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
a520: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74  iColumn;.      t
a530: 65 73 74 63 61 73 65 28 20 28 70 72 65 72 65 71  estcase( (prereq
a540: 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68  Left | extraRigh
a550: 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74  t) != prereqLeft
a560: 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
a570: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72  prereqRight = pr
a580: 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61  ereqLeft | extra
a590: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65  Right;.      pNe
a5a0: 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  w->prereqAll = p
a5b0: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20  rereqAll;.      
a5c0: 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pNew->eOperator 
a5d0: 3d 20 28 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28  = (operatorMask(
a5e0: 70 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45 78 74  pDup->op) + eExt
a5f0: 72 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a  raOp) & opMask;.
a600: 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64      }.  }..#ifnd
a610: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
a620: 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54  ETWEEN_OPTIMIZAT
a630: 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65  ION.  /* If a te
a640: 72 6d 20 69 73 20 74 68 65 20 42 45 54 57 45 45  rm is the BETWEE
a650: 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61  N operator, crea
a660: 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75  te two new virtu
a670: 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68  al terms.  ** th
a680: 61 74 20 64 65 66 69 6e 65 20 74 68 65 20 72 61  at define the ra
a690: 6e 67 65 20 74 68 61 74 20 74 68 65 20 42 45 54  nge that the BET
a6a0: 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e  WEEN implements.
a6b0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20    For example:. 
a6c0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61 20   **.  **      a 
a6d0: 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 0a  BETWEEN b AND c.
a6e0: 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e    **.  ** is con
a6f0: 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20 2a  verted into:.  *
a700: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61 20 42  *.  **      (a B
a710: 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 29 20  ETWEEN b AND c) 
a720: 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44 20 28  AND (a>=b) AND (
a730: 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  a<=c).  **.  ** 
a740: 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65 72 6d  The two new term
a750: 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e 74 6f  s are added onto
a760: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a770: 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65  WhereClause obje
a780: 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65 77  ct..  ** The new
a790: 20 74 65 72 6d 73 20 61 72 65 20 22 64 79 6e 61   terms are "dyna
a7a0: 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63 68 69  mic" and are chi
a7b0: 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f 72 69  ldren of the ori
a7c0: 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20 20  ginal BETWEEN.  
a7d0: 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74 20 6d  ** term.  That m
a7e0: 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65  eans that if the
a7f0: 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73   BETWEEN term is
a800: 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68 69 6c   coded, the chil
a810: 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73 6b  dren are.  ** sk
a820: 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66 20 74  ipped.  Or, if t
a830: 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20  he children are 
a840: 73 61 74 69 73 66 69 65 64 20 62 79 20 61 6e 20  satisfied by an 
a850: 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69 67 69  index, the origi
a860: 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45 4e  nal.  ** BETWEEN
a870: 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70 65 64   term is skipped
a880: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
a890: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
a8a0: 42 45 54 57 45 45 4e 20 26 26 20 70 57 43 2d 3e  BETWEEN && pWC->
a8b0: 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
a8c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
a8d0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
a8e0: 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  st;.    int i;. 
a8f0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
a900: 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47  u8 ops[] = {TK_G
a910: 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61  E, TK_LE};.    a
a920: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
a930: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
a940: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29  List->nExpr==2 )
a950: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
a960: 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
a970: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a  Expr *pNewExpr;.
a980: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
a990: 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72  ;.      pNewExpr
a9a0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
a9b0: 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c 20  pParse, ops[i], 
a9c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
a9e0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
a9f0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30   pExpr->pLeft, 0
aa00: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
aa30: 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  b, pList->a[i].p
aa40: 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20  Expr, 0), 0);.  
aa50: 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
aa60: 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70  Markings(pNewExp
aa70: 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  r, pExpr);.     
aa80: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
aa90: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
aaa0: 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f   pNewExpr, TERM_
aab0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
aac0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73  AMIC);.      tes
aad0: 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30  tcase( idxNew==0
aae0: 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e   );.      exprAn
aaf0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
ab00: 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20   idxNew);.      
ab10: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
ab20: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
ab30: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69  pWC->a[idxNew].i
ab40: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
ab50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65 72  ;.    }.    pTer
ab60: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20  m->nChild = 2;. 
ab70: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
ab80: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
ab90: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
aba0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
abb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
abc0: 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21  TIMIZATION) && !
abd0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
abe0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20  MIT_SUBQUERY).  
abf0: 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72  /* Analyze a ter
ac00: 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f 73  m that is compos
ac10: 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ed of two or mor
ac20: 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65  e subterms conne
ac30: 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20  cted by.  ** an 
ac40: 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  OR operator..  *
ac50: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  /.  else if( pEx
ac60: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b  pr->op==TK_OR ){
ac70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 43  .    assert( pWC
ac80: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ->op==TK_AND );.
ac90: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f      exprAnalyzeO
aca0: 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43 2c  rTerm(pSrc, pWC,
acb0: 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 70   idxTerm);.    p
acc0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
acd0: 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e  dxTerm];.  }.#en
ace0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
acf0: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
ad00: 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ON */..#ifndef S
ad10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
ad20: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f  OPTIMIZATION.  /
ad30: 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e 74  * Add constraint
ad40: 73 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20  s to reduce the 
ad50: 73 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e 20  search space on 
ad60: 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20  a LIKE or GLOB. 
ad70: 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   ** operator..  
ad80: 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70  **.  ** A like p
ad90: 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66 6f  attern of the fo
ada0: 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62 63 25  rm "x LIKE 'abc%
adb0: 27 22 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e  '" is changed in
adc0: 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  to constraints. 
add0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
ade0: 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20 78    x>='abc' AND x
adf0: 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49 4b  <'abd' AND x LIK
ae00: 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20  E 'abc%'.  **.  
ae10: 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61 72  ** The last char
ae20: 61 63 74 65 72 20 6f 66 20 74 68 65 20 70 72 65  acter of the pre
ae30: 66 69 78 20 22 61 62 63 22 20 69 73 20 69 6e 63  fix "abc" is inc
ae40: 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d  remented to form
ae50: 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e   the.  ** termin
ae60: 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20  ation condition 
ae70: 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66  "abd"..  */.  if
ae80: 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  ( pWC->op==TK_AN
ae90: 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b 65 4f  D .   && isLikeO
aea0: 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20 70 45  rGlob(pParse, pE
aeb0: 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26 69 73  xpr, &pStr1, &is
aec0: 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73  Complete, &noCas
aed0: 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72  e).  ){.    Expr
aee0: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 2f   *pLeft;       /
aef0: 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c  * LHS of LIKE/GL
af00: 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  OB operator */. 
af10: 20 20 20 45 78 70 72 20 2a 70 53 74 72 32 3b 20     Expr *pStr2; 
af20: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
af30: 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f 66 20   pStr1 - RHS of 
af40: 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74  LIKE/GLOB operat
af50: 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  or */.    Expr *
af60: 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20 20 45  pNewExpr1;.    E
af70: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a  xpr *pNewExpr2;.
af80: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31 3b      int idxNew1;
af90: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 32  .    int idxNew2
afa0: 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c  ;.    Token sCol
afb0: 6c 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61  lSeqName;  /* Na
afc0: 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20  me of collating 
afd0: 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20  sequence */..   
afe0: 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
aff0: 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
b000: 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32 20 3d  xpr;.    pStr2 =
b010: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
b020: 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a 20  db, pStr1, 0);. 
b030: 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
b040: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
b050: 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20 20 20    u8 c, *pC;    
b060: 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 72 61     /* Last chara
b070: 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20  cter before the 
b080: 66 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 2a  first wildcard *
b090: 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28 75 38  /.      pC = (u8
b0a0: 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b  *)&pStr2->u.zTok
b0b0: 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  en[sqlite3Strlen
b0c0: 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b  30(pStr2->u.zTok
b0d0: 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20  en)-1];.      c 
b0e0: 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69 66 28  = *pC;.      if(
b0f0: 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20   noCase ){.     
b100: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20     /* The point 
b110: 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20  is to increment 
b120: 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  the last charact
b130: 65 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  er before the fi
b140: 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  rst.        ** w
b150: 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20 69 66  ildcard.  But if
b160: 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20 27 40   we increment '@
b170: 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  ', that will pus
b180: 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a 20 20  h it into the.  
b190: 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61 62 65        ** alphabe
b1a0: 74 69 63 20 72 61 6e 67 65 20 77 68 65 72 65 20  tic range where 
b1b0: 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73  case conversions
b1c0: 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20 74 68   will mess up th
b1d0: 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  e .        ** in
b1e0: 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20 61 76  equality.  To av
b1f0: 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65 20 73  oid this, make s
b200: 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75 6e 20  ure to also run 
b210: 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20 20 20  the full.       
b220: 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20   ** LIKE on all 
b230: 63 61 6e 64 69 64 61 74 65 20 65 78 70 72 65 73  candidate expres
b240: 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72 69 6e  sions by clearin
b250: 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65 74 65  g the isComplete
b260: 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20 2a 2f   flag.        */
b270: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
b280: 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70 6c 65  'A'-1 ) isComple
b290: 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  te = 0;.        
b2a0: 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72  c = sqlite3Upper
b2b0: 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20  ToLower[c];.    
b2c0: 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20    }.      *pC = 
b2d0: 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  c + 1;.    }.   
b2e0: 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e 7a 20   sCollSeqName.z 
b2f0: 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43 41  = noCase ? "NOCA
b300: 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a  SE" : "BINARY";.
b310: 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65      sCollSeqName
b320: 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70 4e 65 77  .n = 6;.    pNew
b330: 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 45  Expr1 = sqlite3E
b340: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
b350: 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78  , 0);.    pNewEx
b360: 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78  pr1 = sqlite3PEx
b370: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45  pr(pParse, TK_GE
b380: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  , .           sq
b390: 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c  lite3ExprAddColl
b3a0: 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  ateToken(pParse,
b3b0: 70 4e 65 77 45 78 70 72 31 2c 26 73 43 6f 6c 6c  pNewExpr1,&sColl
b3c0: 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  SeqName),.      
b3d0: 20 20 20 20 20 70 53 74 72 31 2c 20 30 29 3b 0a       pStr1, 0);.
b3e0: 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
b3f0: 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70  Markings(pNewExp
b400: 72 31 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  r1, pExpr);.    
b410: 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43  idxNew1 = whereC
b420: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
b430: 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d   pNewExpr1, TERM
b440: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
b450: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74  NAMIC);.    test
b460: 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d 30  case( idxNew1==0
b470: 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
b480: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
b490: 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e 65  dxNew1);.    pNe
b4a0: 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33  wExpr2 = sqlite3
b4b0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
b4c0: 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45  t, 0);.    pNewE
b4d0: 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33 50 45  xpr2 = sqlite3PE
b4e0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c  xpr(pParse, TK_L
b4f0: 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  T,.           sq
b500: 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c  lite3ExprAddColl
b510: 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  ateToken(pParse,
b520: 70 4e 65 77 45 78 70 72 32 2c 26 73 43 6f 6c 6c  pNewExpr2,&sColl
b530: 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  SeqName),.      
b540: 20 20 20 20 20 70 53 74 72 32 2c 20 30 29 3b 0a       pStr2, 0);.
b550: 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
b560: 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70  Markings(pNewExp
b570: 72 32 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  r2, pExpr);.    
b580: 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43  idxNew2 = whereC
b590: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
b5a0: 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d   pNewExpr2, TERM
b5b0: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
b5c0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74  NAMIC);.    test
b5d0: 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30  case( idxNew2==0
b5e0: 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
b5f0: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
b600: 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65  dxNew2);.    pTe
b610: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
b620: 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69  Term];.    if( i
b630: 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  sComplete ){.   
b640: 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
b650: 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  1].iParent = idx
b660: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d  Term;.      pWC-
b670: 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72  >a[idxNew2].iPar
b680: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
b690: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
b6a0: 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  ld = 2;.    }.  
b6b0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b6c0: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
b6d0: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
b6e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b6f0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
b700: 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54   /* Add a WO_MAT
b710: 43 48 20 61 75 78 69 6c 69 61 72 79 20 74 65 72  CH auxiliary ter
b720: 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61  m to the constra
b730: 69 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a 20  int set if the. 
b740: 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72   ** current expr
b750: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
b760: 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d   form:  column M
b770: 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20  ATCH expr..  ** 
b780: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
b790: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
b7a0: 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f  xBestIndex metho
b7b0: 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75  ds of.  ** virtu
b7c0: 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20  al tables.  The 
b7d0: 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f 70 74  native query opt
b7e0: 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20  imizer does not 
b7f0: 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20  attempt.  ** to 
b800: 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68  do anything with
b810: 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73   MATCH functions
b820: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d  ..  */.  if( isM
b830: 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78  atchOfColumn(pEx
b840: 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  pr) ){.    int i
b850: 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20  dxNew;.    Expr 
b860: 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
b870: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
b880: 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69  pNewTerm;.    Bi
b890: 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75  tmask prereqColu
b8a0: 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a  mn, prereqExpr;.
b8b0: 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45  .    pRight = pE
b8c0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
b8d0: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c  0].pExpr;.    pL
b8e0: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  eft = pExpr->x.p
b8f0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
b900: 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72  ;.    prereqExpr
b910: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
b920: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67  e(pMaskSet, pRig
b930: 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43  ht);.    prereqC
b940: 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c  olumn = exprTabl
b950: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
b960: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28   pLeft);.    if(
b970: 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70   (prereqExpr & p
b980: 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20  rereqColumn)==0 
b990: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
b9a0: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70  NewExpr;.      p
b9b0: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
b9c0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
b9d0: 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20  K_MATCH, .      
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74          0, sqlit
ba00: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 52  e3ExprDup(db, pR
ba10: 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20  ight, 0), 0);.  
ba20: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
ba30: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
ba40: 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45  WC, pNewExpr, TE
ba50: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
ba60: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
ba70: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
ba80: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
ba90: 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  wTerm = &pWC->a[
baa0: 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70  idxNew];.      p
bab0: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  NewTerm->prereqR
bac0: 69 67 68 74 20 3d 20 70 72 65 72 65 71 45 78 70  ight = prereqExp
bad0: 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  r;.      pNewTer
bae0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
baf0: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
bb00: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75       pNewTerm->u
bb10: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
bb20: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
bb30: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f      pNewTerm->eO
bb40: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54  perator = WO_MAT
bb50: 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  CH;.      pNewTe
bb60: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64  rm->iParent = id
bb70: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65  xTerm;.      pTe
bb80: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
bb90: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65  Term];.      pTe
bba0: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
bbb0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
bbc0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
bbd0: 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IED;.      pNewT
bbe0: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
bbf0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
bc00: 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  l;.    }.  }.#en
bc10: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
bc20: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
bc30: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
bc40: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
bc50: 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20 57 68 65  R_STAT4.  /* Whe
bc60: 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68  n sqlite_stat3 h
bc70: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73  istogram data is
bc80: 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70   available an op
bc90: 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a 20 20  erator of the.  
bca0: 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f  ** form "x IS NO
bcb0: 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65  T NULL" can some
bcc0: 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75 61 74  times be evaluat
bcd0: 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ed more efficien
bce0: 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e  tly.  ** as "x>N
bcf0: 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e 6f 74  ULL" if x is not
bd00: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
bd10: 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e  ARY KEY.  So con
bd20: 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20 76 69  struct a.  ** vi
bd30: 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20 74 68  rtual term of th
bd40: 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20  at form..  **.  
bd50: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
bd60: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6d 75   virtual term mu
bd70: 73 74 20 62 65 20 74 61 67 67 65 64 20 77 69 74  st be tagged wit
bd80: 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54  h TERM_VNULL.  T
bd90: 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f 56 4e  his.  ** TERM_VN
bda0: 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73 75 70  ULL tag will sup
bdb0: 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d 6e 75  press the not-nu
bdc0: 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68 65 20  ll check at the 
bdd0: 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f  beginning.  ** o
bde0: 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57 69 74  f the loop.  Wit
bdf0: 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f 56 4e  hout the TERM_VN
be00: 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20 6e 6f  ULL flag, the no
be10: 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 0a  t-null check at.
be20: 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f    ** the start o
be30: 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20  f the loop will 
be40: 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65 73 75  prevent any resu
be50: 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 20 72  lts from being r
be60: 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  eturned..  */.  
be70: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
be80: 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20  K_NOTNULL.   && 
be90: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70  pExpr->pLeft->op
bea0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26  ==TK_COLUMN.   &
beb0: 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  & pExpr->pLeft->
bec0: 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 26 26  iColumn>=0.   &&
bed0: 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
bee0: 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
bef0: 53 74 61 74 33 29 0a 20 20 29 7b 0a 20 20 20 20  Stat3).  ){.    
bf00: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a  Expr *pNewExpr;.
bf10: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
bf20: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
bf30: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
bf40: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
bf50: 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70 4e  NewTerm;..    pN
bf60: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
bf70: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
bf80: 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _GT,.           
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
bfb0: 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a 20  db, pLeft, 0),. 
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfd0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
bfe0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
bff0: 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30  TK_NULL, 0, 0, 0
c000: 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64 78 4e  ), 0);..    idxN
c010: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
c020: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
c030: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41 4c      TERM_VIRTUAL
c060: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45  |TERM_DYNAMIC|TE
c070: 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  RM_VNULL);.    i
c080: 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20 20  f( idxNew ){.   
c090: 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70     pNewTerm = &p
c0a0: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
c0b0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
c0c0: 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a  rereqRight = 0;.
c0d0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c0e0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
c0f0: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
c100: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65    pNewTerm->u.le
c110: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
c120: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
c130: 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72   pNewTerm->eOper
c140: 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20 20  ator = WO_GT;.  
c150: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50      pNewTerm->iP
c160: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
c170: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
c180: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
c190: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
c1a0: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
c1b0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
c1c0: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
c1d0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
c1e0: 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d  rereqAll = pTerm
c1f0: 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  ->prereqAll;.   
c200: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
c210: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
c220: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
c230: 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f  ..  /* Prevent O
c240: 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  N clause terms o
c250: 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72  f a LEFT JOIN fr
c260: 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f  om being used to
c270: 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69   drive.  ** an i
c280: 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20  ndex for tables 
c290: 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
c2a0: 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
c2b0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
c2c0: 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68 74  ht |= extraRight
c2d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
c2e0: 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65  function searche
c2f0: 73 20 70 4c 69 73 74 20 66 6f 72 20 61 6e 20 65  s pList for an e
c300: 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68 65  ntry that matche
c310: 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  s the iCol-th co
c320: 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65 78  lumn.** of index
c330: 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   pIdx..**.** If 
c340: 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73 69  such an expressi
c350: 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 73  on is found, its
c360: 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 2d   index in pList-
c370: 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65 64  >a[] is returned
c380: 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65  . If.** no expre
c390: 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ssion is found, 
c3a0: 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  -1 is returned..
c3b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
c3c0: 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61  ndIndexCol(.  Pa
c3d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c3f0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
c400: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
c410: 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
c420: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
c430: 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63 68  n list to search
c440: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c   */.  int iBase,
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
c470: 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63 69  for table associ
c480: 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20 2a  ated with pIdx *
c490: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4b0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
c4c0: 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  match column of 
c4d0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20  */.  int iCol   
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f       /* Column o
c500: 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63 68  f index to match
c510: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
c520: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
c530: 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
c540: 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72  ll[iCol];..  for
c550: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
c560: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
c570: 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
c580: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
c590: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
c5a0: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  pr);.    if( p->
c5b0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
c5c0: 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e     && p->iColumn
c5d0: 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
c5e0: 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20 70  [iCol].     && p
c5f0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 0a  ->iTable==iBase.
c600: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c      ){.      Col
c610: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
c620: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
c630: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
c640: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
c650: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43     if( ALWAYS(pC
c660: 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69 74  oll) && 0==sqlit
c670: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
c680: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29  >zName, zColl) )
c690: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
c6a0: 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
c6b0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
c6c0: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  -1;.}../*.** Ret
c6d0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
c6e0: 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73  DISTINCT express
c6f0: 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20  ion-list passed 
c700: 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
c710: 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75  ument.** is redu
c720: 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44  ndant..**.** A D
c730: 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20  ISTINCT list is 
c740: 72 65 64 75 6e 64 61 6e 74 20 69 66 20 74 68 65  redundant if the
c750: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
c760: 6e 73 20 73 6f 6d 65 20 73 75 62 73 65 74 20 6f  ns some subset o
c770: 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61  f.** columns tha
c780: 74 20 61 72 65 20 75 6e 69 71 75 65 20 61 6e 64  t are unique and
c790: 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74   non-null..*/.st
c7a0: 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74 69  atic int isDisti
c7b0: 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20 20  nctRedundant(.  
c7c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c7d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
c7e0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c7f0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
c800: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ist,        /* T
c810: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
c820: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
c830: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
c840: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
c850: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
c860: 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20 20 20  *pDistinct      
c870: 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
c880: 65 74 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  et that needs to
c890: 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a   be DISTINCT */.
c8a0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
c8b0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
c8c0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65 3b     .  int iBase;
c8f0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
c900: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
c910: 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73 65   table or sub-se
c920: 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d  lect in the FROM
c930: 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a 20   clause of.  ** 
c940: 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e  this query, then
c950: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
c960: 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f 77  possible to show
c970: 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e   that the DISTIN
c980: 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20  CT .  ** clause 
c990: 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f  is redundant. */
c9a0: 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  .  if( pTabList-
c9b0: 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
c9c0: 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20 70  n 0;.  iBase = p
c9d0: 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
c9e0: 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20  ursor;.  pTab = 
c9f0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  pTabList->a[0].p
ca00: 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  Tab;..  /* If an
ca10: 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
ca20: 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20 63  ions is an IPK c
ca30: 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20 69  olumn on table i
ca40: 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75 72  Base, then retur
ca50: 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e 6f  n .  ** true. No
ca60: 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61 62  te: The (p->iTab
ca70: 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74 20  le==iBase) part 
ca80: 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d 61 79  of this test may
ca90: 20 62 65 20 66 61 6c 73 65 20 69 66 20 74 68 65   be false if the
caa0: 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53 45  .  ** current SE
cab0: 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72 65 6c  LECT is a correl
cac0: 61 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e 0a  ated sub-query..
cad0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
cae0: 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78  i<pDistinct->nEx
caf0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
cb00: 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45  pr *p = sqlite3E
cb10: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
cb20: 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70  Distinct->a[i].p
cb30: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
cb40: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
cb50: 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  && p->iTable==iB
cb60: 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  ase && p->iColum
cb70: 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  n<0 ) return 1;.
cb80: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74    }..  /* Loop t
cb90: 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69 63  hrough all indic
cba0: 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c  es on the table,
cbb0: 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20 74   checking each t
cbc0: 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b 65  o see if it make
cbd0: 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54 49  s.  ** the DISTI
cbe0: 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72 65  NCT qualifier re
cbf0: 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65 73  dundant. It does
cc00: 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a   so if:.  **.  *
cc10: 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65 78  *   1. The index
cc20: 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51 55   is itself UNIQU
cc30: 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a  E, and.  **.  **
cc40: 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65     2. All of the
cc50: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
cc60: 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65 72  index are either
cc70: 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44 69   part of the pDi
cc80: 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20  stinct.  **     
cc90: 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20 74   list, or else t
cca0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
ccb0: 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d 20  contains a term 
ccc0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c  of the form "col
ccd0: 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77  =X",.  **      w
cce0: 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e 73  here X is a cons
ccf0: 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65 20  tant value. The 
cd00: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
cd10: 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ces of the.  ** 
cd20: 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20       comparison 
cd30: 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  and select-list 
cd40: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
cd50: 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66 20   match those of 
cd60: 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  the index..  **.
cd70: 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f 66    **   3. All of
cd80: 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f 6c   those index col
cd90: 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20 74  umns for which t
cda0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
cdb0: 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20 20  does not.  **   
cdc0: 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63 6f     contain a "co
cdd0: 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73 75  l=X" term are su
cde0: 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20 4e  bject to a NOT N
cdf0: 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  ULL constraint..
ce00: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d    */.  for(pIdx=
ce10: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
ce20: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
ce30: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 21  Next){.    if( !
ce40: 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
ce50: 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  dx) ) continue;.
ce60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
ce70: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  Idx->nKeyCol; i+
ce80: 2b 29 7b 0a 20 20 20 20 20 20 69 31 36 20 69 43  +){.      i16 iC
ce90: 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ol = pIdx->aiCol
cea0: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  umn[i];.      if
ceb0: 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57  ( 0==findTerm(pW
cec0: 43 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20  C, iBase, iCol, 
ced0: 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f  ~(Bitmask)0, WO_
cee0: 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20  EQ, pIdx) ){.   
cef0: 20 20 20 20 20 69 6e 74 20 69 49 64 78 43 6f 6c       int iIdxCol
cf00: 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28   = findIndexCol(
cf10: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
cf20: 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20  t, iBase, pIdx, 
cf30: 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
cf40: 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61  iIdxCol<0 || pTa
cf50: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f  b->aCol[iCol].no
cf60: 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  tNull==0 ){.    
cf70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cf80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
cf90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
cfa0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b  pIdx->nKeyCol ){
cfb0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
cfc0: 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74 68 61  ndex implies tha
cfd0: 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71  t the DISTINCT q
cfe0: 75 61 6c 69 66 69 65 72 20 69 73 20 72 65 64 75  ualifier is redu
cff0: 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  ndant. */.      
d000: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
d010: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
d020: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  .}.../*.** Estim
d030: 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69 74 68  ate the logarith
d040: 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76  m of the input v
d050: 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32 2e 0a  alue to base 2..
d060: 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
d070: 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e   estLog(LogEst N
d080: 29 7b 0a 20 20 72 65 74 75 72 6e 20 4e 3c 3d 31  ){.  return N<=1
d090: 30 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4c  0 ? 0 : sqlite3L
d0a0: 6f 67 45 73 74 28 4e 29 20 2d 20 33 33 3b 0a 7d  ogEst(N) - 33;.}
d0b0: 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74  ../*.** Two rout
d0c0: 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e  ines for printin
d0d0: 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
d0e0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
d0f0: 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  x_info.** struct
d100: 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74  ure.  Used for t
d110: 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
d120: 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e  ging only.  If n
d130: 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45  either.** SQLITE
d140: 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f  _TEST or SQLITE_
d150: 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e 65  DEBUG are define
d160: 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f  d, then these ro
d170: 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f  utines.** are no
d180: 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  -ops..*/.#if !de
d190: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d1a0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
d1b0: 26 26 20 64 65 66 69 6e 65 64 28 57 48 45 52 45  && defined(WHERE
d1c0: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73  TRACE_ENABLED).s
d1d0: 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
d1e0: 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69  _IDX_INPUTS(sqli
d1f0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
d200: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
d210: 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65  f( !sqlite3Where
d220: 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a  Trace ) return;.
d230: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
d240: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
d250: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
d260: 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e  bugPrintf("  con
d270: 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c  straint[%d]: col
d280: 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70  =%d termid=%d op
d290: 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e  =%d usabled=%d\n
d2a0: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
d2b0: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
d2c0: 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20  nt[i].iColumn,. 
d2d0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
d2e0: 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66  aint[i].iTermOff
d2f0: 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  set,.       p->a
d300: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70  Constraint[i].op
d310: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
d320: 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
d330: 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  e);.  }.  for(i=
d340: 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79  0; i<p->nOrderBy
d350: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
d360: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
d370: 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63    orderby[%d]: c
d380: 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22  ol=%d desc=%d\n"
d390: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
d3a0: 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
d3b0: 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ].iColumn,.     
d3c0: 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
d3d0: 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74  .desc);.  }.}.st
d3e0: 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f  atic void TRACE_
d3f0: 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69  IDX_OUTPUTS(sqli
d400: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
d410: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
d420: 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65  f( !sqlite3Where
d430: 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a  Trace ) return;.
d440: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
d450: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
d460: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
d470: 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73 61  bugPrintf("  usa
d480: 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d  ge[%d]: argvIdx=
d490: 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20  %d omit=%d\n",. 
d4a0: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
d4b0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
d4c0: 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
d4d0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
d4e0: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
d4f0: 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  omit);.  }.  sql
d500: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
d510: 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c  "  idxNum=%d\n",
d520: 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73   p->idxNum);.  s
d530: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d540: 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e  f("  idxStr=%s\n
d550: 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20  ", p->idxStr);. 
d560: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d570: 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f  ntf("  orderByCo
d580: 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d  nsumed=%d\n", p-
d590: 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
d5a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
d5b0: 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d  gPrintf("  estim
d5c0: 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20  atedCost=%g\n", 
d5d0: 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  p->estimatedCost
d5e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
d5f0: 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d  gPrintf("  estim
d600: 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22  atedRows=%lld\n"
d610: 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  , p->estimatedRo
d620: 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  ws);.}.#else.#de
d630: 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49  fine TRACE_IDX_I
d640: 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65  NPUTS(A).#define
d650: 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
d660: 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69  TS(A).#endif..#i
d670: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d680: 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
d690: 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  X./*.** Return T
d6a0: 52 55 45 20 69 66 20 74 68 65 20 57 48 45 52 45  RUE if the WHERE
d6b0: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65   clause term pTe
d6c0: 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20  rm is of a form 
d6d0: 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c  where it.** coul
d6e0: 64 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  d be used with a
d6f0: 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73  n index to acces
d700: 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67  s pSrc, assuming
d710: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a   an appropriate.
d720: 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74 65 64  ** index existed
d730: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d740: 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
d750: 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  x(.  WhereTerm *
d760: 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  pTerm,          
d770: 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
d780: 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63  use term to chec
d790: 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  k */.  struct Sr
d7a0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
d7b0: 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77  ,     /* Table w
d7c0: 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
d7d0: 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d  access */.  Bitm
d7e0: 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20  ask notReady    
d7f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
d800: 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f  bles in outer lo
d810: 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ops of the join 
d820: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66  */.){.  char aff
d830: 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c  ;.  if( pTerm->l
d840: 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d  eftCursor!=pSrc-
d850: 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74 75 72  >iCursor ) retur
d860: 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72  n 0;.  if( (pTer
d870: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
d880: 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65 74 75 72  O_EQ)==0 ) retur
d890: 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72  n 0;.  if( (pTer
d8a0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
d8b0: 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20   notReady)!=0 ) 
d8c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
d8d0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
d8e0: 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30  umn<0 ) return 0
d8f0: 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e  ;.  aff = pSrc->
d900: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d  pTab->aCol[pTerm
d910: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e  ->u.leftColumn].
d920: 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20  affinity;.  if( 
d930: 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66  !sqlite3IndexAff
d940: 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70  inityOk(pTerm->p
d950: 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65 74  Expr, aff) ) ret
d960: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
d970: 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  1;.}.#endif...#i
d980: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d990: 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
d9a0: 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  X./*.** Generate
d9b0: 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75   code to constru
d9c0: 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
d9d0: 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d  ect for an autom
d9e0: 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e  atic index.** an
d9f0: 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65 20  d to set up the 
da00: 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63  WhereLevel objec
da10: 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74  t pLevel so that
da20: 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
da30: 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65  tor.** makes use
da40: 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69   of the automati
da50: 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  c index..*/.stat
da60: 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63  ic void construc
da70: 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
da80: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
da90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
daa0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
dab0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
dac0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
dad0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
dae0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
daf0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
db00: 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
db10: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
db20: 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e  erm to get the n
db30: 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42  ext index */.  B
db40: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
db50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
db60: 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
db70: 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
db80: 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c  able */.  WhereL
db90: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20  evel *pLevel    
dba0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
dbb0: 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f  ew index here */
dbc0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f  .){.  int nKeyCo
dbd0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
dbe0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
dbf0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f  olumns in the co
dc00: 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78 20  nstructed index 
dc10: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
dc20: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
dc30: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
dc40: 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
dc50: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
dc60: 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20  Term *pWCEnd;   
dc70: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
dc80: 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49   pWC->a[] */.  I
dc90: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
dca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
dcb0: 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20  ject describing 
dcc0: 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  the transient in
dcd0: 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
dce0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dcf0: 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64       /* Prepared
dd00: 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
dd10: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
dd20: 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b  .  int addrInit;
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dd40: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
dd50: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
dd60: 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20  bypass jump */. 
dd70: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20   Table *pTable; 
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd90: 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
dda0: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
ddb0: 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
ddc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
ddd0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 66 69 6c  of the index fil
dde0: 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  l loop */.  int 
ddf0: 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20  regRecord;      
de00: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
de10: 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69  ter holding an i
de20: 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
de30: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de50: 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a  Column counter *
de60: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
de90: 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74 43 6f  */.  int mxBitCo
dea0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
deb0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75   /* Maximum colu
dec0: 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55  mn in pSrc->colU
ded0: 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71  sed */.  CollSeq
dee0: 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
def0: 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
df00: 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e  g sequence to on
df10: 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57   a column */.  W
df20: 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
df30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
df40: 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  e Loop object */
df50: 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65  .  char *zNotUse
df60: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
df70: 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 6f 6e  * Extra space on
df80: 20 74 68 65 20 65 6e 64 20 6f 66 20 70 49 64 78   the end of pIdx
df90: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 64   */.  Bitmask id
dfa0: 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  xCols;          
dfb0: 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 63    /* Bitmap of c
dfc0: 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72 20  olumns used for 
dfd0: 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69  indexing */.  Bi
dfe0: 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b  tmask extraCols;
dff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
e000: 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e 61  map of additiona
e010: 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75  l columns */.  u
e020: 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20  8 sentWarning = 
e030: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  0;         /* Tr
e040: 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69 6e 67  ue if a warnning
e050: 20 68 61 73 20 62 65 65 6e 20 69 73 73 75 65 64   has been issued
e060: 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61   */..  /* Genera
e070: 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69 70 20  te code to skip 
e080: 6f 76 65 72 20 74 68 65 20 63 72 65 61 74 69 6f  over the creatio
e090: 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61  n and initializa
e0a0: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tion of the.  **
e0b0: 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
e0c0: 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75 62 73   on 2nd and subs
e0d0: 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e  equent iteration
e0e0: 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a  s of the loop. *
e0f0: 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
e100: 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
e110: 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64 72 49   v!=0 );.  addrI
e120: 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  nit = sqlite3Cod
e130: 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56  eOnce(pParse); V
e140: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
e150: 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
e160: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
e170: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 61  s that will be a
e180: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65  dded to the inde
e190: 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65 64 20  x.  ** and used 
e1a0: 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45 20 63  to match WHERE c
e1b0: 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
e1c0: 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d  s */.  nKeyCol =
e1d0: 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70   0;.  pTable = p
e1e0: 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43  Src->pTab;.  pWC
e1f0: 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57  End = &pWC->a[pW
e200: 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f  C->nTerm];.  pLo
e210: 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
e220: 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d  oop;.  idxCols =
e230: 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
e240: 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
e250: 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
e260: 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
e270: 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
e280: 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
e290: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
e2a0: 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
e2b0: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
e2c0: 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
e2d0: 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b  iCol>=BMS ? MASK
e2e0: 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53  BIT(BMS-1) : MAS
e2f0: 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20  KBIT(iCol);.    
e300: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
e310: 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74  ==BMS );.      t
e320: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
e330: 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-1 );.      if
e340: 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20 29  ( !sentWarning )
e350: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e360: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
e370: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a  NING_AUTOINDEX,.
e380: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 75 74              "aut
e390: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e 20  omatic index on 
e3a0: 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65 2d  %s(%s)", pTable-
e3b0: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
e3c0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
e3d0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  [iCol].zName);. 
e3e0: 20 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e 69         sentWarni
e3f0: 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ng = 1;.      }.
e400: 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
e410: 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
e420: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 68  {.        if( wh
e430: 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50  ereLoopResize(pP
e440: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c  arse->db, pLoop,
e450: 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 20 72 65   nKeyCol+1) ) re
e460: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4c  turn;.        pL
e470: 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79  oop->aLTerm[nKey
e480: 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a  Col++] = pTerm;.
e490: 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20          idxCols 
e4a0: 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20  |= cMask;.      
e4b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
e4c0: 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c 3e 30 20  sert( nKeyCol>0 
e4d0: 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  );.  pLoop->u.bt
e4e0: 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  ree.nEq = pLoop-
e4f0: 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65 79 43 6f  >nLTerm = nKeyCo
e500: 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  l;.  pLoop->wsFl
e510: 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
e520: 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44  MN_EQ | WHERE_ID
e530: 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49  X_ONLY | WHERE_I
e540: 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20 20 20  NDEXED.         
e550: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 57 48              | WH
e560: 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a  ERE_AUTO_INDEX;.
e570: 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
e580: 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69  number of additi
e590: 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  onal columns nee
e5a0: 64 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a  ded to create a.
e5b0: 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e    ** covering in
e5c0: 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e  dex.  A "coverin
e5d0: 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69  g index" is an i
e5e0: 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
e5f0: 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75  ns all.  ** colu
e600: 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e 65 65  mns that are nee
e610: 64 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79  ded by the query
e620: 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65 72 69  .  With a coveri
e630: 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20  ng index, the.  
e640: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  ** original tabl
e650: 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  e never needs to
e660: 20 62 65 20 61 63 63 65 73 73 65 64 2e 20 20 41   be accessed.  A
e670: 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73  utomatic indices
e680: 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20   must.  ** be a 
e690: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62  covering index b
e6a0: 65 63 61 75 73 65 20 74 68 65 20 69 6e 64 65 78  ecause the index
e6b0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64   will not be upd
e6c0: 61 74 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a  ated if the.  **
e6d0: 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
e6e0: 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20  changes and the 
e6f0: 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20  index and table 
e700: 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75  cannot both be u
e710: 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79  sed.  ** if they
e720: 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e   go out of sync.
e730: 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c  .  */.  extraCol
e740: 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  s = pSrc->colUse
e750: 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20  d & (~idxCols | 
e760: 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 29 3b  MASKBIT(BMS-1));
e770: 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28 70  .  mxBitCol = (p
e780: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42  Table->nCol >= B
e790: 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a 20  MS-1) ? BMS-1 : 
e7a0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20  pTable->nCol;.  
e7b0: 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65  testcase( pTable
e7c0: 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ->nCol==BMS-1 );
e7d0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
e7e0: 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32  ble->nCol==BMS-2
e7f0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
e800: 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b  <mxBitCol; i++){
e810: 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f  .    if( extraCo
e820: 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20  ls & MASKBIT(i) 
e830: 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d  ) nKeyCol++;.  }
e840: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
e850: 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42  Used & MASKBIT(B
e860: 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65  MS-1) ){.    nKe
e870: 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e  yCol += pTable->
e880: 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a  nCol - BMS + 1;.
e890: 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46    }.  pLoop->wsF
e8a0: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
e8b0: 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f  LUMN_EQ | WHERE_
e8c0: 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f 2a 20  IDX_ONLY;..  /* 
e8d0: 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  Construct the In
e8e0: 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65  dex object to de
e8f0: 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65  scribe this inde
e900: 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71  x */.  pIdx = sq
e910: 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64  lite3AllocateInd
e920: 65 78 4f 62 6a 65 63 74 28 70 50 61 72 73 65 2d  exObject(pParse-
e930: 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20  >db, nKeyCol+1, 
e940: 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a 20  0, &zNotUsed);. 
e950: 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72   if( pIdx==0 ) r
e960: 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  eturn;.  pLoop->
e970: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
e980: 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a   pIdx;.  pIdx->z
e990: 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64  Name = "auto-ind
e9a0: 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61  ex";.  pIdx->pTa
e9b0: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ble = pTable;.  
e9c0: 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73  n = 0;.  idxCols
e9d0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
e9e0: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
e9f0: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
ea00: 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
ea10: 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
ea20: 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
ea30: 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
ea40: 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
ea50: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
ea60: 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
ea70: 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
ea80: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
ea90: 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
eaa0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
eab0: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
eac0: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
ead0: 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
eae0: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
eaf0: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
eb00: 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
eb10: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
eb20: 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20       idxCols |= 
eb30: 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  cMask;.        p
eb40: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
eb50: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
eb60: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
eb70: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
eb80: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
eb90: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
eba0: 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
ebb0: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  t);.        pIdx
ebc0: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c  ->azColl[n] = AL
ebd0: 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43  WAYS(pColl) ? pC
ebe0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49  oll->zName : "BI
ebf0: 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e  NARY";.        n
ec00: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
ec10: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
ec20: 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75  (u32)n==pLoop->u
ec30: 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20  .btree.nEq );.. 
ec40: 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e   /* Add addition
ec50: 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
ec60: 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75  d to make the au
ec70: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e  tomatic index in
ec80: 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69  to.  ** a coveri
ec90: 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f  ng index */.  fo
eca0: 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f  r(i=0; i<mxBitCo
ecb0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
ecc0: 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53   extraCols & MAS
ecd0: 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20  KBIT(i) ){.     
ece0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
ecf0: 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
ed00: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
ed10: 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
ed20: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
ed30: 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
ed40: 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53  ed & MASKBIT(BMS
ed50: 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  -1) ){.    for(i
ed60: 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65  =BMS-1; i<pTable
ed70: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
ed80: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
ed90: 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
eda0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
edb0: 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   = "BINARY";.   
edc0: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
edd0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e  }.  assert( n==n
ede0: 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70 49 64 78  KeyCol );.  pIdx
edf0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
ee00: 2d 31 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f  -1;.  pIdx->azCo
ee10: 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[n] = "BINARY"
ee20: 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  ;..  /* Create t
ee30: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
ee40: 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ex */.  assert( 
ee50: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e  pLevel->iIdxCur>
ee60: 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e  =0 );.  pLevel->
ee70: 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65  iIdxCur = pParse
ee80: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69  ->nTab++;.  sqli
ee90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
eea0: 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65   OP_OpenAutoinde
eeb0: 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  x, pLevel->iIdxC
eec0: 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 3b 0a  ur, nKeyCol+1);.
eed0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
eee0: 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  P4KeyInfo(pParse
eef0: 2c 20 70 49 64 78 29 3b 0a 20 20 56 64 62 65 43  , pIdx);.  VdbeC
ef00: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20  omment((v, "for 
ef10: 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  %s", pTable->zNa
ef20: 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  me));..  /* Fill
ef30: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
ef40: 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e  ndex with conten
ef50: 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d  t */.  addrTop =
ef60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ef70: 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
ef80: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
ef90: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
efa0: 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20  v);.  regRecord 
efb0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
efc0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
efd0: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
efe0: 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70  dexKey(pParse, p
eff0: 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  Idx, pLevel->iTa
f000: 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c  bCur, regRecord,
f010: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
f020: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f030: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
f040: 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t, pLevel->iIdxC
f050: 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ur, regRecord);.
f060: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
f070: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
f080: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
f090: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f0a0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
f0b0: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
f0c0: 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62   addrTop+1); Vdb
f0d0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f0e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
f0f0: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53 54  eP5(v, SQLITE_ST
f100: 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44  MTSTATUS_AUTOIND
f110: 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EX);.  sqlite3Vd
f120: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
f130: 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65  drTop);.  sqlite
f140: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
f150: 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
f160: 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70  d);.  .  /* Jump
f170: 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70   here when skipp
f180: 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
f190: 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  zation */.  sqli
f1a0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
f1b0: 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 7d 0a  v, addrInit);.}.
f1c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f1d0: 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
f1e0: 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65  INDEX */..#ifnde
f1f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
f200: 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
f210: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f   Allocate and po
f220: 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65  pulate an sqlite
f230: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
f240: 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 74 68  ucture. It is th
f250: 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  e .** responsibi
f260: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
f270: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
f280: 20 72 65 6c 65 61 73 65 20 74 68 65 20 73 74 72   release the str
f290: 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73  ucture.** by pas
f2a0: 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72  sing the pointer
f2b0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
f2c0: 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71  s function to sq
f2d0: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
f2e0: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
f2f0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f  index_info *allo
f300: 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20  cateIndexInfo(. 
f310: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
f320: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
f330: 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63  WC,.  struct Src
f340: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
f350: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
f360: 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69  derBy.){.  int i
f370: 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d  , j;.  int nTerm
f380: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
f390: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
f3a0: 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
f3b0: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
f3c0: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70  index_orderby *p
f3d0: 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74  IdxOrderBy;.  st
f3e0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
f3f0: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
f400: 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57  age *pUsage;.  W
f410: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
f420: 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
f430: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
f440: 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b  _info *pIdxInfo;
f450: 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
f460: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69   number of possi
f470: 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ble WHERE clause
f480: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66   constraints ref
f490: 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74  erring.  ** to t
f4a0: 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  his virtual tabl
f4b0: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65  e */.  for(i=nTe
f4c0: 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  rm=0, pTerm=pWC-
f4d0: 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
f4e0: 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
f4f0: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
f500: 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
f510: 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
f520: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
f530: 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
f540: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
f550: 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29  r & ~WO_EQUIV) )
f560: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
f570: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f580: 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
f590: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
f5a0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
f5b0: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
f5c0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
f5d0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
f5e0: 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  L );.    if( (pT
f5f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
f600: 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f   ~(WO_ISNULL|WO_
f610: 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e  EQUIV))==0 ) con
f620: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
f630: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
f640: 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e  TERM_VNULL ) con
f650: 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d  tinue;.    nTerm
f660: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ++;.  }..  /* If
f670: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
f680: 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  ause contains on
f690: 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ly columns in th
f6a0: 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20  e current .  ** 
f6b0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
f6c0: 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  en allocate spac
f6d0: 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72  e for the aOrder
f6e0: 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20  By part of.  ** 
f6f0: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
f700: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
f710: 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42  ..  */.  nOrderB
f720: 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72  y = 0;.  if( pOr
f730: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74  derBy ){.    int
f740: 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e   n = pOrderBy->n
f750: 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Expr;.    for(i=
f760: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
f770: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
f780: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
f790: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
f7a0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
f7b0: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d  COLUMN || pExpr-
f7c0: 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69  >iTable!=pSrc->i
f7d0: 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
f7e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
f7f0: 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65  =n){.      nOrde
f800: 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20  rBy = n;.    }. 
f810: 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
f820: 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  e the sqlite3_in
f830: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
f840: 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e  re.  */.  pIdxIn
f850: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
f860: 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
f870: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64  >db, sizeof(*pId
f880: 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20  xInfo).         
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8a0: 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64    + (sizeof(*pId
f8b0: 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28  xCons) + sizeof(
f8c0: 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a  *pUsage))*nTerm.
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8e0: 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a             + siz
f8f0: 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79  eof(*pIdxOrderBy
f900: 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  )*nOrderBy );.  
f910: 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
f920: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
f930: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
f940: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
f950: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
f960: 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
f970: 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
f980: 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
f990: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
f9a0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
f9b0: 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
f9c0: 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
f9d0: 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
f9e0: 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
f9f0: 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e  rom.  ** changin
fa00: 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
fa10: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
fa20: 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
fa30: 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69  er to.  ** initi
fa40: 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
fa50: 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  ds..  */.  pIdxC
fa60: 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71  ons = (struct sq
fa70: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
fa80: 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66  traint*)&pIdxInf
fa90: 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65  o[1];.  pIdxOrde
faa0: 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71  rBy = (struct sq
fab0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
fac0: 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e  rby*)&pIdxCons[n
fad0: 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20  Term];.  pUsage 
fae0: 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
faf0: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
fb00: 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f  nt_usage*)&pIdxO
fb10: 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d  rderBy[nOrderBy]
fb20: 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
fb30: 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
fb40: 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69  t = nTerm;.  *(i
fb50: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
fb60: 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
fb70: 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
fb80: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
fb90: 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
fba0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
fbb0: 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a   = pIdxCons;.  *
fbc0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
fbd0: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
fbe0: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
fbf0: 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
fc00: 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
fc10: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
fc20: 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26  traint_usage**)&
fc30: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
fc40: 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20  raintUsage =.   
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69  pUsage;..  for(i
fca0: 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  =j=0, pTerm=pWC-
fcb0: 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
fcc0: 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
fcd0: 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20  .    u8 op;.    
fce0: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
fcf0: 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
fd00: 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
fd10: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
fd20: 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
fd30: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
fd40: 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
fd50: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
fd60: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
fd70: 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
fd80: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
fd90: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
fda0: 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
fdb0: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
fdc0: 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a  tor & WO_ALL );.
fdd0: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
fde0: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f  eOperator & ~(WO
fdf0: 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56  _ISNULL|WO_EQUIV
fe00: 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ))==0 ) continue
fe10: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
fe20: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
fe30: 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  VNULL ) continue
fe40: 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
fe50: 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72  ].iColumn = pTer
fe60: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
fe70: 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
fe80: 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69  .iTermOffset = i
fe90: 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38 29 70  ;.    op = (u8)p
fea0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
feb0: 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66  & WO_ALL;.    if
fec0: 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70  ( op==WO_IN ) op
fed0: 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49   = WO_EQ;.    pI
fee0: 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f  dxCons[j].op = o
fef0: 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69  p;.    /* The di
ff00: 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  rect assignment 
ff10: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
ff20: 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65  line is possible
ff30: 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20   only because.  
ff40: 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64    ** the WO_ and
ff50: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
ff60: 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20  NSTRAINT_ codes 
ff70: 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  are identical.  
ff80: 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  The.    ** follo
ff90: 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72  wing asserts ver
ffa0: 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ify this fact. *
ffb0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  /.    assert( WO
ffc0: 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _EQ==SQLITE_INDE
ffd0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
ffe0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
fff0: 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LT==SQLITE_IND
10000 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
10010 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
10020 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LE==SQLITE_IN
10030 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
10040 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
10050 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_GT==SQLITE_I
10060 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
10070 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GT );.    assert
10080 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_GE==SQLITE_
10090 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
100a0 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GE );.    asser
100b0 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c  t( WO_MATCH==SQL
100c0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
100d0 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20  AINT_MATCH );.  
100e0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
100f0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
10100 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c  _IN|WO_EQ|WO_LT|
10110 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
10120 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20  E|WO_MATCH) );. 
10130 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f     j++;.  }.  fo
10140 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
10150 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  y; i++){.    Exp
10160 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
10170 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
10180 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
10190 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  [i].iColumn = pE
101a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
101b0 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d    pIdxOrderBy[i]
101c0 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79  .desc = pOrderBy
101d0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
101e0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
101f0 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a  pIdxInfo;.}../*.
10200 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a  ** The table obj
10210 65 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61  ect reference pa
10220 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
10230 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
10240 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
10250 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61  must represent a
10260 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
10270 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  This function in
10280 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49  vokes the xBestI
10290 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  ndex().** method
102a0 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
102b0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
102c0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
102d0 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  o object that.**
102e0 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65   comes in as the
102f0 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f   3rd argument to
10300 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
10310 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
10320 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65  r occurs, pParse
10330 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
10340 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  th an error mess
10350 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e  age and a.** non
10360 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72  -zero value is r
10370 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
10380 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
10390 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  d and the output
103a0 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
103b0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
103c0 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
103d0 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a  left populated..
103e0 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
103f0 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73   not an error is
10400 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73   returned, it is
10410 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
10420 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61  ity of the.** ca
10430 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
10440 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74  ly free p->idxSt
10450 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72  r if p->needToFr
10460 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74  eeIdxStr indicat
10470 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20  es.** that this 
10480 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  is required..*/.
10490 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42  static int vtabB
104a0 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a  estIndex(Parse *
104b0 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
104c0 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64  Tab, sqlite3_ind
104d0 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73  ex_info *p){.  s
104e0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
104f0 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  ab = sqlite3GetV
10500 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
10510 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a  , pTab)->pVtab;.
10520 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
10530 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  c;..  TRACE_IDX_
10540 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20  INPUTS(p);.  rc 
10550 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  = pVtab->pModule
10560 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74  ->xBestIndex(pVt
10570 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f  ab, p);.  TRACE_
10580 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a  IDX_OUTPUTS(p);.
10590 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
105a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
105b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
105c0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
105d0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
105e0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
105f0 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45  e if( !pVtab->zE
10600 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73  rrMsg ){.      s
10610 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
10620 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c  Parse, "%s", sql
10630 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b  ite3ErrStr(rc));
10640 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10650 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10660 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
10670 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
10680 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
10690 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d  ite3_free(pVtab-
106a0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74  >zErrMsg);.  pVt
106b0 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ab->zErrMsg = 0;
106c0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
106d0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
106e0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d  ++){.    if( !p-
106f0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
10700 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f  usable && p->aCo
10710 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
10720 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a  .argvIndex>0 ){.
10730 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
10740 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
10750 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20           "table 
10760 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72  %s: xBestIndex r
10770 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c  eturned an inval
10780 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e  id plan", pTab->
10790 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
107a0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72  }..  return pPar
107b0 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64  se->nErr;.}.#end
107c0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
107d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
107e0 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a 23 69  ALTABLE) */...#i
107f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10800 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
10810 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
10820 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
10830 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65   a particular ke
10840 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73  y among all keys
10850 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e   in an.** index.
10860 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75    Store the resu
10870 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20  lts in aStat as 
10880 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
10890 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20    aStat[0]      
108a0 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72  Est. number of r
108b0 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56  ows less than pV
108c0 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31  al.**    aStat[1
108d0 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62  ]      Est. numb
108e0 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c  er of rows equal
108f0 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52   to pVal.**.** R
10900 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
10910 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73  on success..*/.s
10920 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
10930 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61 72 73  KeyStats(.  Pars
10940 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
10950 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
10960 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
10970 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
10980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10990 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73  /* Index to cons
109a0 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a  ider domain of *
109b0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
109c0 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20  rd *pRec,       
109d0 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c  /* Vector of val
109e0 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  ues to consider 
109f0 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70  */.  int roundUp
10a00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10a10 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20   /* Round up if 
10a20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77  true.  Round dow
10a30 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20  n if false */.  
10a40 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20  tRowcnt *aStat  
10a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
10a60 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74 65  UT: stats writte
10a70 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  n here */.){.  I
10a80 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d  ndexSample *aSam
10a90 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d  ple = pIdx->aSam
10aa0 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  ple;.  int iCol;
10ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ac0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
10ad0 65 71 75 69 72 65 64 20 73 74 61 74 73 20 69 6e  equired stats in
10ae0 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a   anEq[] etc. */.
10af0 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20    int iMin = 0; 
10b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b10 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   Smallest sample
10b20 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64 20   not yet tested 
10b30 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 49 64  */.  int i = pId
10b40 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20 20 20 20  x->nSample;     
10b50 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d   /* Smallest sam
10b60 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ple larger than 
10b70 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63  or equal to pRec
10b80 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b   */.  int iTest;
10b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ba0 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65    /* Next sample
10bb0 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e   to test */.  in
10bc0 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
10bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
10be0 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
10bf0 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  n operation */..
10c00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
10c10 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41  EBUG.  UNUSED_PA
10c20 52 41 4d 45 54 45 52 28 20 70 50 61 72 73 65 20  RAMETER( pParse 
10c30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
10c40 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b 0a 20  rt( pRec!=0 );. 
10c50 20 69 43 6f 6c 20 3d 20 70 52 65 63 2d 3e 6e 46   iCol = pRec->nF
10c60 69 65 6c 64 20 2d 20 31 3b 0a 20 20 61 73 73 65  ield - 1;.  asse
10c70 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  rt( pIdx->nSampl
10c80 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
10c90 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20   pRec->nField>0 
10ca0 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 53  && iCol<pIdx->nS
10cb0 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 20 20 64 6f  ampleCol );.  do
10cc0 7b 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28 69  {.    iTest = (i
10cd0 4d 69 6e 2b 69 29 2f 32 3b 0a 20 20 20 20 72 65  Min+i)/2;.    re
10ce0 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
10cf0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
10d00 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 6e 2c 20 61  mple[iTest].n, a
10d10 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 70 2c  Sample[iTest].p,
10d20 20 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20   pRec);.    if( 
10d30 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  res<0 ){.      i
10d40 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20  Min = iTest+1;. 
10d50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10d60 69 20 3d 20 69 54 65 73 74 3b 0a 20 20 20 20 7d  i = iTest;.    }
10d70 0a 20 20 7d 77 68 69 6c 65 28 20 72 65 73 20 26  .  }while( res &
10d80 26 20 69 4d 69 6e 3c 69 20 29 3b 0a 0a 23 69 66  & iMin<i );..#if
10d90 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
10da0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
10db0 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
10dc0 6d 65 6e 74 73 20 63 68 65 63 6b 20 74 68 61 74  ments check that
10dd0 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72   the binary sear
10de0 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61 62 6f  ch code.  ** abo
10df0 76 65 20 66 6f 75 6e 64 20 74 68 65 20 72 69 67  ve found the rig
10e00 68 74 20 61 6e 73 77 65 72 2e 20 54 68 69 73 20  ht answer. This 
10e10 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e 6f 20  block serves no 
10e20 70 75 72 70 6f 73 65 20 6f 74 68 65 72 0a 20 20  purpose other.  
10e30 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76 6f 6b  ** than to invok
10e40 65 20 74 68 65 20 61 73 73 65 72 74 73 2e 20 20  e the asserts.  
10e50 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  */.  if( res==0 
10e60 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 28 72 65  ){.    /* If (re
10e70 73 3d 3d 30 29 20 69 73 20 74 72 75 65 2c 20 74  s==0) is true, t
10e80 68 65 6e 20 73 61 6d 70 6c 65 20 24 69 20 6d 75  hen sample $i mu
10e90 73 74 20 62 65 20 65 71 75 61 6c 20 74 6f 20 70  st be equal to p
10ea0 52 65 63 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  Rec */.    asser
10eb0 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  t( i<pIdx->nSamp
10ec0 6c 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  le );.    assert
10ed0 28 20 30 3d 3d 73 71 6c 69 74 65 33 56 64 62 65  ( 0==sqlite3Vdbe
10ee0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
10ef0 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d  ample[i].n, aSam
10f00 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 0a  ple[i].p, pRec).
10f10 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
10f20 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
10f30 69 6c 65 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  iled );.  }else{
10f40 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73  .    /* Otherwis
10f50 65 2c 20 70 52 65 63 20 6d 75 73 74 20 62 65 20  e, pRec must be 
10f60 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d  smaller than sam
10f70 70 6c 65 20 24 69 20 61 6e 64 20 6c 61 72 67 65  ple $i and large
10f80 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 73 61  r than.    ** sa
10f90 6d 70 6c 65 20 28 24 69 2d 31 29 2e 20 20 2a 2f  mple ($i-1).  */
10fa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
10fb0 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20  pIdx->nSample . 
10fc0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
10fd0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
10fe0 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  are(aSample[i].n
10ff0 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20  , aSample[i].p, 
11000 70 52 65 63 29 3e 30 0a 20 20 20 20 20 20 20 20  pRec)>0.        
11010 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
11020 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
11030 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30      assert( i==0
11040 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  .         || sql
11050 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
11060 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 2d  mpare(aSample[i-
11070 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 2d  1].n, aSample[i-
11080 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a 20 20  1].p, pRec)<0.  
11090 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
110a0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
110b0 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ed );.  }.#endif
110c0 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45   /* ifdef SQLITE
110d0 5f 44 45 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a 20  _DEBUG */..  /* 
110e0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61  At this point, a
110f0 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65  Sample[i] is the
11100 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68   first sample th
11110 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
11120 61 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c  an.  ** or equal
11130 20 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66   to pVal.  Or if
11140 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i==pIdx->nSampl
11150 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70  e, then all samp
11160 6c 65 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a  les are less.  *
11170 2a 20 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66  * than pVal.  If
11180 20 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61   aSample[i]==pVa
11190 6c 2c 20 74 68 65 6e 20 72 65 73 3d 3d 30 2e 0a  l, then res==0..
111a0 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d    */.  if( res==
111b0 30 20 29 7b 0a 20 20 20 20 61 53 74 61 74 5b 30  0 ){.    aStat[0
111c0 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  ] = aSample[i].a
111d0 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61  nLt[iCol];.    a
111e0 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c  Stat[1] = aSampl
111f0 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b  e[i].anEq[iCol];
11200 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52  .  }else{.    tR
11210 6f 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55  owcnt iLower, iU
11220 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20  pper, iGap;.    
11230 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20  if( i==0 ){.    
11240 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    iLower = 0;.  
11250 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61      iUpper = aSa
11260 6d 70 6c 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[0].anLt[iCo
11270 6c 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l];.    }else{. 
11280 20 20 20 20 20 69 36 34 20 6e 52 6f 77 30 20 3d       i64 nRow0 =
11290 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
112a0 49 6e 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c  Int(pIdx->aiRowL
112b0 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20  ogEst[0]);.     
112c0 20 69 55 70 70 65 72 20 3d 20 69 3e 3d 70 49 64   iUpper = i>=pId
112d0 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 52 6f  x->nSample ? nRo
112e0 77 30 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  w0 : aSample[i].
112f0 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
11300 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70    iLower = aSamp
11310 6c 65 5b 69 2d 31 5d 2e 61 6e 45 71 5b 69 43 6f  le[i-1].anEq[iCo
11320 6c 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31  l] + aSample[i-1
11330 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anLt[iCol];.  
11340 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d    }.    aStat[1]
11350 20 3d 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b   = pIdx->aAvgEq[
11360 69 43 6f 6c 5d 3b 0a 20 20 20 20 69 66 28 20 69  iCol];.    if( i
11370 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b  Lower>=iUpper ){
11380 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b  .      iGap = 0;
11390 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
113a0 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72 20    iGap = iUpper 
113b0 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a  - iLower;.    }.
113c0 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20      if( roundUp 
113d0 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  ){.      iGap = 
113e0 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20  (iGap*2)/3;.    
113f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61  }else{.      iGa
11400 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20  p = iGap/3;.    
11410 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  }.    aStat[0] =
11420 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a   iLower + iGap;.
11430 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
11440 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
11450 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
11460 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  ./*.** If it is 
11470 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20  not NULL, pTerm 
11480 69 73 20 61 20 74 65 72 6d 20 74 68 61 74 20 70  is a term that p
11490 72 6f 76 69 64 65 73 20 61 6e 20 75 70 70 65 72  rovides an upper
114a0 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75   or lower.** bou
114b0 6e 64 20 6f 6e 20 61 20 72 61 6e 67 65 20 73 63  nd on a range sc
114c0 61 6e 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e 73  an. Without cons
114d0 69 64 65 72 69 6e 67 20 70 54 65 72 6d 2c 20 69  idering pTerm, i
114e0 74 20 69 73 20 65 73 74 69 6d 61 74 65 64 20 0a  t is estimated .
114f0 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61 6e  ** that the scan
11500 20 77 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77   will visit nNew
11510 20 72 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63   rows. This func
11520 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
11530 20 6e 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d   number.** estim
11540 61 74 65 64 20 74 6f 20 62 65 20 76 69 73 69 74  ated to be visit
11550 65 64 20 61 66 74 65 72 20 74 61 6b 69 6e 67 20  ed after taking 
11560 70 54 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75  pTerm into accou
11570 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  nt..**.** If the
11580 20 75 73 65 72 20 65 78 70 6c 69 63 69 74 6c 79   user explicitly
11590 20 73 70 65 63 69 66 69 65 64 20 61 20 6c 69 6b   specified a lik
115a0 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 20  elihood() value 
115b0 66 6f 72 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a  for this term,.*
115c0 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  * then the retur
115d0 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6c  n value is the l
115e0 69 6b 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70  ikelihood multip
115f0 6c 69 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  lied by the numb
11600 65 72 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72  er of.** input r
11610 6f 77 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ows. Otherwise, 
11620 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
11630 73 75 6d 65 73 20 74 68 61 74 20 61 6e 20 22 49  sumes that an "I
11640 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d  S NOT NULL" term
11650 0a 2a 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c 69  .** has a likeli
11660 68 6f 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e  hood of 0.50, an
11670 64 20 61 6e 79 20 6f 74 68 65 72 20 74 65 72 6d  d any other term
11680 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66   a likelihood of
11690 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63   0.25..*/.static
116a0 20 4c 6f 67 45 73 74 20 77 68 65 72 65 52 61 6e   LogEst whereRan
116b0 67 65 41 64 6a 75 73 74 28 57 68 65 72 65 54 65  geAdjust(WhereTe
116c0 72 6d 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73  rm *pTerm, LogEs
116d0 74 20 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73  t nNew){.  LogEs
116e0 74 20 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20  t nRet = nNew;. 
116f0 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
11700 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75    if( pTerm->tru
11710 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20  thProb<=0 ){.   
11720 20 20 20 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d     nRet += pTerm
11730 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20  ->truthProb;.   
11740 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72   }else if( (pTer
11750 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
11760 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  M_VNULL)==0 ){. 
11770 20 20 20 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b       nRet -= 20;
11780 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11790 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  20==sqlite3LogEs
117a0 74 28 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  t(4) );.    }.  
117b0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b  }.  return nRet;
117c0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
117d0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
117e0 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54  R_STAT4./* .** T
117f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11800 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d 61  called to estima
11810 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
11820 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   rows visited by
11830 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61 6e   a.** range-scan
11840 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e 20   on a skip-scan 
11850 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70  index. For examp
11860 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  le:.**.**   CREA
11870 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
11880 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20 20  1(a, b, c);.**  
11890 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
118a0 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20  1 WHERE a=? AND 
118b0 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  c BETWEEN ? AND 
118c0 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20 70  ?;.**.** Value p
118d0 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63 75  Loop->nOut is cu
118e0 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74  rrently set to t
118f0 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
11900 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a 20  ber of rows .** 
11910 76 69 73 69 74 65 64 20 66 6f 72 20 73 63 61 6e  visited for scan
11920 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62 3d  ning (a=? AND b=
11930 3f 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ?). This functio
11940 6e 20 72 65 64 75 63 65 73 20 74 68 61 74 20 65  n reduces that e
11950 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20 73  stimate .** by s
11960 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f 20 61 63  ome factor to ac
11970 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28 63  count for the (c
11980 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
11990 29 20 65 78 70 72 65 73 73 69 6f 6e 20 62 61 73  ) expression bas
119a0 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61  ed.** on the sta
119b0 74 34 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  t4 data for the 
119c0 69 6e 64 65 78 2e 20 74 68 69 73 20 73 63 61 6e  index. this scan
119d0 20 77 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d 65   will be peforme
119e0 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74  d multiple .** t
119f0 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72 20 65  imes (once for e
11a00 61 63 68 20 28 61 2c 62 29 20 63 6f 6d 62 69 6e  ach (a,b) combin
11a10 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 74 63 68  ation that match
11a20 65 73 20 61 3d 3f 29 20 69 73 20 64 65 61 6c 74  es a=?) is dealt
11a30 20 77 69 74 68 20 0a 2a 2a 20 62 79 20 74 68 65   with .** by the
11a40 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   caller..**.** I
11a50 74 20 64 6f 65 73 20 74 68 69 73 20 62 79 20 73  t does this by s
11a60 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
11a70 61 6c 6c 20 73 74 61 74 34 20 73 61 6d 70 6c 65  all stat4 sample
11a80 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76 61 6c  s, comparing val
11a90 75 65 73 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  ues.** extracted
11aa0 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64   from pLower and
11ab0 20 70 55 70 70 65 72 20 77 69 74 68 20 74 68 65   pUpper with the
11ac0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63   corresponding c
11ad0 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a 2a  olumn in each.**
11ae0 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61 6e   sample. If L an
11af0 64 20 55 20 61 72 65 20 74 68 65 20 6e 75 6d 62  d U are the numb
11b00 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f  er of samples fo
11b10 75 6e 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  und to be less t
11b20 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20  han or.** equal 
11b30 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20 65 78  to the values ex
11b40 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f  tracted from pLo
11b50 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
11b60 65 73 70 65 63 74 69 76 65 6c 79 2c 20 61 6e 64  espectively, and
11b70 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 74 6f 74  .** N is the tot
11b80 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d  al number of sam
11b90 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70 2d  ples, the pLoop-
11ba0 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69 73 20 61  >nOut value is a
11bb0 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20 66 6f  djusted.** as fo
11bc0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e  llows:.**.**   n
11bd0 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20 6d  Out = nOut * ( m
11be0 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20 4e  in(U - L, 1) / N
11bf0 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77   ).**.** If pLow
11c00 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61  er is NULL, or a
11c10 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
11c20 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
11c30 74 68 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a 2a  the term, L is.*
11c40 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 49  * set to zero. I
11c50 66 20 70 55 70 70 65 72 20 69 73 20 4e 55 4c 4c  f pUpper is NULL
11c60 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e  , or a value can
11c70 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
11c80 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20 69   from it,.** U i
11c90 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a  s set to N..**.*
11ca0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73  * Normally, this
11cb0 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a   function sets *
11cc0 70 62 44 6f 6e 65 20 74 6f 20 31 20 62 65 66 6f  pbDone to 1 befo
11cd0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 48 6f  re returning. Ho
11ce0 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20  wever,.** if no 
11cf0 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78 74  value can be ext
11d00 72 61 63 74 65 64 20 66 72 6f 6d 20 65 69 74 68  racted from eith
11d10 65 72 20 70 4c 6f 77 65 72 20 6f 72 20 70 55 70  er pLower or pUp
11d20 70 65 72 20 28 61 6e 64 20 73 6f 20 74 68 65 0a  per (and so the.
11d30 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ** estimate of t
11d40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
11d50 73 20 64 65 6c 69 76 65 72 65 64 20 72 65 6d 61  s delivered rema
11d60 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 29 2c 20  ins unchanged), 
11d70 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65  *pbDone.** is le
11d80 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  ft as is..**.** 
11d90 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
11da0 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
11db0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
11dc0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
11dd0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a   .** SQLITE_OK..
11de0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
11df0 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e  ereRangeSkipScan
11e00 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
11e10 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
11e20 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
11e30 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
11e40 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
11e50 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f  *pLower,   /* Lo
11e60 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  wer bound on the
11e70 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31   range. ex: "x>1
11e80 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  23" Might be NUL
11e90 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  L */.  WhereTerm
11ea0 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55   *pUpper,   /* U
11eb0 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
11ec0 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c  e range. ex: "x<
11ed0 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55  455" Might be NU
11ee0 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  LL */.  WhereLoo
11ef0 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20  p *pLoop,    /* 
11f00 55 70 64 61 74 65 20 74 68 65 20 2e 6e 4f 75 74  Update the .nOut
11f10 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 6c   value of this l
11f20 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  oop */.  int *pb
11f30 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Done          /*
11f40 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
11f50 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 78 70  at least one exp
11f60 72 2e 20 76 61 6c 75 65 20 65 78 74 72 61 63 74  r. value extract
11f70 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  ed */.){.  Index
11f80 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   *p = pLoop->u.b
11f90 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
11fa0 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
11fb0 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73  u.btree.nEq;.  s
11fc0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
11fd0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
11fe0 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69 6e  Lower = -1;.  in
11ff0 74 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e 53  t nUpper = p->nS
12000 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20 72  ample+1;.  int r
12010 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12020 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 61   int iCol = p->a
12030 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20  iColumn[nEq];.  
12040 75 38 20 61 66 66 20 3d 20 69 43 6f 6c 3e 3d 30  u8 aff = iCol>=0
12050 20 3f 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43   ? p->pTable->aC
12060 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74  ol[iCol].affinit
12070 79 20 3a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  y : SQLITE_AFF_I
12080 4e 54 45 47 45 52 3b 0a 20 20 43 6f 6c 6c 53 65  NTEGER;.  CollSe
12090 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73  q *pColl;.  .  s
120a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 31  qlite3_value *p1
120b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
120c0 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65  * Value extracte
120d0 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f  d from pLower */
120e0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
120f0 20 2a 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20   *p2 = 0;       
12100 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
12110 61 63 74 65 64 20 66 72 6f 6d 20 70 55 70 70 65  acted from pUppe
12120 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
12130 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20  alue *pVal = 0; 
12140 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
12150 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
12160 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c  ecord */..  pCol
12170 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  l = sqlite3Locat
12180 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
12190 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29   p->azColl[nEq])
121a0 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29  ;.  if( pLower )
121b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
121c0 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d  e3Stat4ValueFrom
121d0 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 4c 6f  Expr(pParse, pLo
121e0 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  wer->pExpr->pRig
121f0 68 74 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a 20  ht, aff, &p1);. 
12200 20 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     nLower = 0;. 
12210 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72 20   }.  if( pUpper 
12220 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
12230 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
12240 69 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72  ite3Stat4ValueFr
12250 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
12260 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
12270 69 67 68 74 2c 20 61 66 66 2c 20 26 70 32 29 3b  ight, aff, &p2);
12280 0a 20 20 20 20 6e 55 70 70 65 72 20 3d 20 70 32  .    nUpper = p2
12290 20 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c   ? 0 : p->nSampl
122a0 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 31  e;.  }..  if( p1
122b0 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20 69 6e   || p2 ){.    in
122c0 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69  t i;.    int nDi
122d0 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ff;.    for(i=0;
122e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
122f0 26 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20  & i<p->nSample; 
12300 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
12310 20 73 71 6c 69 74 65 33 53 74 61 74 34 43 6f 6c   sqlite3Stat4Col
12320 75 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70  umn(db, p->aSamp
12330 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d  le[i].p, p->aSam
12340 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26  ple[i].n, nEq, &
12350 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  pVal);.      if(
12360 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
12370 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20  & p1 ){.        
12380 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65  int res = sqlite
12390 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20  3MemCompare(p1, 
123a0 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  pVal, pColl);.  
123b0 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30        if( res>=0
123c0 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20   ) nLower++;.   
123d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
123e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
123f0 70 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  p2 ){.        in
12400 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d  t res = sqlite3M
12410 65 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20 70 56  emCompare(p2, pV
12420 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  al, pColl);.    
12430 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29      if( res>=0 )
12440 20 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20   nUpper++;.     
12450 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 69   }.    }.    nDi
12460 66 66 20 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e  ff = (nUpper - n
12470 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Lower);.    if( 
12480 6e 44 69 66 66 3c 3d 30 20 29 20 6e 44 69 66 66  nDiff<=0 ) nDiff
12490 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66   = 1;..    /* If
124a0 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
124b0 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65  n upper and lowe
124c0 72 20 62 6f 75 6e 64 20 73 70 65 63 69 66 69 65  r bound specifie
124d0 64 2c 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20  d, and the .    
124e0 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69  ** comparisons i
124f0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
12500 79 20 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65  y are close toge
12510 74 68 65 72 2c 20 75 73 65 20 74 68 65 20 66 61  ther, use the fa
12520 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65  llback.    ** me
12530 74 68 6f 64 20 28 61 73 73 75 6d 65 20 74 68 61  thod (assume tha
12540 74 20 74 68 65 20 73 63 61 6e 20 76 69 73 69 74  t the scan visit
12550 73 20 31 2f 36 34 20 6f 66 20 74 68 65 20 72 6f  s 1/64 of the ro
12560 77 73 29 20 66 6f 72 20 65 73 74 69 6d 61 74 69  ws) for estimati
12570 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75  ng.    ** the nu
12580 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73  mber of rows vis
12590 69 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ited. Otherwise,
125a0 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
125b0 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20  mber of rows.   
125c0 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 65   ** using the me
125d0 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 69  thod described i
125e0 6e 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  n the header com
125f0 6d 65 6e 74 20 66 6f 72 20 74 68 69 73 20 66 75  ment for this fu
12600 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  nction. */.    i
12610 66 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70  f( nDiff!=1 || p
12620 55 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77  Upper==0 || pLow
12630 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  er==0 ){.      i
12640 6e 74 20 6e 41 64 6a 75 73 74 20 3d 20 28 73 71  nt nAdjust = (sq
12650 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e  lite3LogEst(p->n
12660 53 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74 65  Sample) - sqlite
12670 33 4c 6f 67 45 73 74 28 6e 44 69 66 66 29 29 3b  3LogEst(nDiff));
12680 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  .      pLoop->nO
12690 75 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20  ut -= nAdjust;. 
126a0 20 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31       *pbDone = 1
126b0 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  ;.      WHERETRA
126c0 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65  CE(0x10, ("range
126d0 20 73 6b 69 70 2d 73 63 61 6e 20 72 65 67 69 6f   skip-scan regio
126e0 6e 73 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a 75  ns: %u..%u  adju
126f0 73 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c  st=%d est=%d\n",
12700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12710 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 77              nLow
12720 65 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a  er, nUpper, nAdj
12730 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e  ust*-1, pLoop->n
12740 4f 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Out));.    }..  
12750 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
12760 74 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b  t( *pbDone==0 );
12770 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
12780 61 6c 75 65 46 72 65 65 28 70 31 29 3b 0a 20 20  alueFree(p1);.  
12790 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
127a0 28 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  (p2);.  sqlite3V
127b0 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
127c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
127d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
127e0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
127f0 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
12800 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
12810 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61  s used to estima
12820 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
12830 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
12840 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79  be visited.** by
12850 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64   scanning an ind
12860 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f  ex for a range o
12870 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61  f values. The ra
12880 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20  nge may have an 
12890 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20  upper.** bound, 
128a0 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f  a lower bound, o
128b0 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52  r both. The WHER
128c0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  E clause terms t
128d0 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65  hat set the uppe
128e0 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62  r.** and lower b
128f0 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73  ounds are repres
12900 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20  ented by pLower 
12910 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65  and pUpper respe
12920 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20  ctively. For.** 
12930 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
12940 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69  g that index p i
12950 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a  s on t1(a):.**.*
12960 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
12970 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20  WHERE a > ? AND 
12980 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20  a < ? ....**    
12990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129a0 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f  |_____|   |_____
129b0 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
129c0 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
129d0 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
129e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
129f0 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a  ower    pUpper.*
12a00 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f  *.** If either o
12a10 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c  f the upper or l
12a20 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f  ower bound is no
12a30 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  t present, then 
12a40 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69  NULL is passed i
12a50 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68  n.** place of th
12a60 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
12a70 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  WhereTerm..**.**
12a80 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70   The value in (p
12a90 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
12aa0 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74  .btree.nEq) is t
12ab0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
12ac0 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  index.** column 
12ad0 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72  subject to the r
12ae0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e  ange constraint.
12af0 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c   Or, equivalentl
12b00 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
12b10 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  .** equality con
12b20 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a  straints optimiz
12b30 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73  ed by the propos
12b40 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46  ed index scan. F
12b50 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61  or example,.** a
12b60 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20  ssuming index p 
12b70 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20  is on t1(a, b), 
12b80 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72  and the SQL quer
12b90 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
12ba0 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
12bb0 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20  a = ? AND b > ? 
12bc0 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND b < ? ....**
12bd0 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20  .** then nEq is 
12be0 73 65 74 20 74 6f 20 31 20 28 61 73 20 74 68 65  set to 1 (as the
12bf0 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65   range restricte
12c00 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20  d column, b, is 
12c10 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c  the second .** l
12c20 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
12c30 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f  of the index). O
12c40 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  r, if the query 
12c50 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
12c60 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
12c70 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
12c80 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
12c90 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
12ca0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
12cb0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
12cc0 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20  , *pnOut is set 
12cd0 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f  to the sqlite3Lo
12ce0 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a  gEst() of the.**
12cf0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
12d00 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 73  that the index s
12d10 63 61 6e 20 69 73 20 65 78 70 65 63 74 65 64 20  can is expected 
12d20 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75 74  to visit without
12d30 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67   .** considering
12d40 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74   the range const
12d50 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69  raints. If nEq i
12d60 73 20 30 2c 20 74 68 69 73 20 69 73 20 74 68 65  s 0, this is the
12d70 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 72   number of .** r
12d80 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ows in the index
12d90 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  . Assuming no er
12da0 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e 4f  ror occurs, *pnO
12db0 75 74 20 69 73 20 61 64 6a 75 73 74 65 64 20 28  ut is adjusted (
12dc0 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20 61  reduced).** to a
12dd0 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 72  ccount for the r
12de0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
12df0 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
12e00 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68  er..** .** In th
12e10 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c  e absence of sql
12e20 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a  ite_stat4 ANALYZ
12e30 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73 75  E data, or if su
12e40 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20 62  ch data cannot b
12e50 65 0a 2a 2a 20 75 73 65 64 2c 20 61 20 73 69 6e  e.** used, a sin
12e60 67 6c 65 20 72 61 6e 67 65 20 69 6e 65 71 75 61  gle range inequa
12e70 6c 69 74 79 20 72 65 64 75 63 65 73 20 74 68 65  lity reduces the
12e80 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79   search space by
12e90 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20   a factor of 4. 
12ea0 0a 2a 2a 20 61 6e 64 20 61 20 70 61 69 72 20 6f  .** and a pair o
12eb0 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78  f constraints (x
12ec0 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75  >? AND x<?) redu
12ed0 63 65 73 20 74 68 65 20 65 78 70 65 63 74 65 64  ces the expected
12ee0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f   number of.** ro
12ef0 77 73 20 76 69 73 69 74 65 64 20 62 79 20 61 20  ws visited by a 
12f00 66 61 63 74 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f  factor of 64..*/
12f10 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
12f20 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20  eRangeScanEst(. 
12f30 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
12f40 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
12f50 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
12f60 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
12f70 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
12f80 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68   *pBuilder,.  Wh
12f90 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c  ereTerm *pLower,
12fa0 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e     /* Lower boun
12fb0 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
12fc0 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68  ex: "x>123" Migh
12fd0 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
12fe0 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72  hereTerm *pUpper
12ff0 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75  ,   /* Upper bou
13000 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
13010 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67   ex: "x<455" Mig
13020 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
13030 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
13040 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74       /* Modify t
13050 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79  he .nOut and may
13060 62 65 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20  be .rRun fields 
13070 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
13080 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
13090 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e  t nOut = pLoop->
130a0 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e  nOut;.  LogEst n
130b0 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  New;..#ifdef SQL
130c0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
130d0 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e 64 65  _OR_STAT4.  Inde
130e0 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  x *p = pLoop->u.
130f0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
13100 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  int nEq = pLoop-
13110 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20  >u.btree.nEq;.. 
13120 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e   if( p->nSample>
13130 30 0a 20 20 20 26 26 20 6e 45 71 3c 70 2d 3e 6e  0.   && nEq<p->n
13140 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 26 26 20  SampleCol.   && 
13150 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
13160 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  led(pParse->db, 
13170 53 51 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20  SQLITE_Stat3) . 
13180 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 45 71 3d   ){.    if( nEq=
13190 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56  =pBuilder->nRecV
131a0 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 55 6e  alid ){.      Un
131b0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
131c0 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ec = pBuilder->p
131d0 52 65 63 3b 0a 20 20 20 20 20 20 74 52 6f 77 63  Rec;.      tRowc
131e0 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20 20 20 75  nt a[2];.      u
131f0 38 20 61 66 66 3b 0a 0a 20 20 20 20 20 20 2f 2a  8 aff;..      /*
13200 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77 65 72   Variable iLower
13210 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
13220 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  the estimate of 
13230 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
13240 77 73 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20  ws in .      ** 
13250 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61  the index that a
13260 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  re less than the
13270 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20   lower bound of 
13280 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
13290 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f   The.      ** lo
132a0 77 65 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20  wer bound being 
132b0 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f  the concatenatio
132c0 6e 20 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20  n of $P and $L, 
132d0 77 68 65 72 65 20 24 50 20 69 73 20 74 68 65 0a  where $P is the.
132e0 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65        ** key-pre
132f0 66 69 78 20 66 6f 72 6d 65 64 20 62 79 20 74 68  fix formed by th
13300 65 20 6e 45 71 20 76 61 6c 75 65 73 20 6d 61 74  e nEq values mat
13310 63 68 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ched against the
13320 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20   nEq left-most. 
13330 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20       ** columns 
13340 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e  of the index, an
13350 64 20 24 4c 20 69 73 20 74 68 65 20 76 61 6c 75  d $L is the valu
13360 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20  e in pLower..   
13370 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
13380 72 2c 20 69 66 20 70 4c 6f 77 65 72 20 69 73 20  r, if pLower is 
13390 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61 6e 6e 6f  NULL or $L canno
133a0 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66  t be extracted f
133b0 72 6f 6d 20 69 74 20 28 62 65 63 61 75 73 65 20  rom it (because 
133c0 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e  it.      ** is n
133d0 6f 74 20 61 20 73 69 6d 70 6c 65 20 76 61 72 69  ot a simple vari
133e0 61 62 6c 65 20 6f 72 20 6c 69 74 65 72 61 6c 20  able or literal 
133f0 76 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f 77 65  value), the lowe
13400 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20  r bound of the. 
13410 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 69 73       ** range is
13420 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20 71 75   $P. Due to a qu
13430 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79 20 77  irk in the way w
13440 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 77  hereKeyStats() w
13450 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20 20  orks, even.     
13460 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61   ** if $L is ava
13470 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79  ilable, whereKey
13480 53 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65  Stats() is calle
13490 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20  d for both ($P) 
134a0 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 28 24  and .      ** ($
134b0 50 3a 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61  P:$L) and the la
134c0 72 67 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  rger of the two 
134d0 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20  returned values 
134e0 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  used..      **. 
134f0 20 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c       ** Similarl
13500 79 2c 20 69 55 70 70 65 72 20 69 73 20 74 6f 20  y, iUpper is to 
13510 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73  be set to the es
13520 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
13530 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20  mber of rows.   
13540 20 20 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20     ** less than 
13550 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20  the upper bound 
13560 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65  of the range que
13570 72 79 2e 20 57 68 65 72 65 20 74 68 65 20 75 70  ry. Where the up
13580 70 65 72 20 62 6f 75 6e 64 0a 20 20 20 20 20 20  per bound.      
13590 2a 2a 20 69 73 20 65 69 74 68 65 72 20 28 24 50  ** is either ($P
135a0 29 20 6f 72 20 28 24 50 3a 24 55 29 2e 20 41 67  ) or ($P:$U). Ag
135b0 61 69 6e 2c 20 65 76 65 6e 20 69 66 20 24 55 20  ain, even if $U 
135c0 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f  is available, bo
135d0 74 68 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20  th values.      
135e0 2a 2a 20 6f 66 20 69 55 70 70 65 72 20 61 72 65  ** of iUpper are
135f0 20 72 65 71 75 65 73 74 65 64 20 6f 66 20 77 68   requested of wh
13600 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 61 6e  ereKeyStats() an
13610 64 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 75 73  d the smaller us
13620 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
13630 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
13640 72 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74  r;.      tRowcnt
13650 20 69 55 70 70 65 72 3b 0a 0a 20 20 20 20 20 20   iUpper;..      
13660 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20 20 20  if( pRec ){.    
13670 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
13680 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42 75 69  ec->nField!=pBui
13690 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
136a0 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d  );.        pRec-
136b0 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75 69 6c 64  >nField = pBuild
136c0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20  er->nRecValid;. 
136d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
136e0 20 6e 45 71 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c   nEq==p->nKeyCol
136f0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 66 66 20   ){.        aff 
13700 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
13710 45 47 45 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EGER;.      }els
13720 65 7b 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d  e{.        aff =
13730 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c   p->pTable->aCol
13740 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  [p->aiColumn[nEq
13750 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  ]].affinity;.   
13760 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 44 65     }.      /* De
13770 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61  termine iLower a
13780 6e 64 20 69 55 70 70 65 72 20 75 73 69 6e 67 20  nd iUpper using 
13790 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  ($P) only. */.  
137a0 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29      if( nEq==0 )
137b0 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72  {.        iLower
137c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55   = 0;.        iU
137d0 70 70 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pper = sqlite3Lo
137e0 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52  gEstToInt(p->aiR
137f0 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20  owLogEst[0]);.  
13800 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13810 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73     /* Note: this
13820 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20 6f   call could be o
13830 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20 2d 20  ptimized away - 
13840 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65 20 76  since the same v
13850 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20 20 20  alues must .    
13860 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e      ** have been
13870 20 72 65 71 75 65 73 74 65 64 20 77 68 65 6e 20   requested when 
13880 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20 69  testing key $P i
13890 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  n whereEqualScan
138a0 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20 20  Est().  */.     
138b0 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73     whereKeyStats
138c0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
138d0 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 20  , 0, a);.       
138e0 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a   iLower = a[0];.
138f0 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20 3d          iUpper =
13900 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20   a[0] + a[1];.  
13910 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
13920 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70  If possible, imp
13930 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77  rove on the iLow
13940 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e  er estimate usin
13950 67 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20  g ($P:$L). */.  
13960 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29      if( pLower )
13970 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 4f  {.        int bO
13980 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
13990 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
139a0 20 76 61 6c 75 65 20 69 73 20 65 78 74 72 61 63   value is extrac
139b0 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
139c0 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
139d0 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e  pExpr = pLower->
139e0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
139f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
13a00 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
13a10 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  r & (WO_GT|WO_GE
13a20 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ))!=0 );.       
13a30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
13a40 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
13a50 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
13a60 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45  , pExpr, aff, nE
13a70 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20  q, &bOk);.      
13a80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13a90 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
13aa0 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
13ab0 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
13ac0 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
13ad0 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30  arse, p, pRec, 0
13ae0 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , a);.          
13af0 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28  iNew = a[0] + ((
13b00 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
13b10 72 20 26 20 57 4f 5f 47 54 29 20 3f 20 61 5b 31  r & WO_GT) ? a[1
13b20 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ] : 0);.        
13b30 20 20 69 66 28 20 69 4e 65 77 3e 69 4c 6f 77 65    if( iNew>iLowe
13b40 72 20 29 20 69 4c 6f 77 65 72 20 3d 20 69 4e 65  r ) iLower = iNe
13b50 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75  w;.          nOu
13b60 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t--;.          p
13b70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Lower = 0;.     
13b80 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
13b90 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62      /* If possib
13ba0 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74  le, improve on t
13bb0 68 65 20 69 55 70 70 65 72 20 65 73 74 69 6d 61  he iUpper estima
13bc0 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24 55 29  te using ($P:$U)
13bd0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
13be0 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Upper ){.       
13bf0 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20   int bOk;       
13c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13c10 54 72 75 65 20 69 66 20 76 61 6c 75 65 20 69 73  True if value is
13c20 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
13c30 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20  pExpr */.       
13c40 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
13c50 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
13c60 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
13c70 73 65 72 74 28 20 28 70 55 70 70 65 72 2d 3e 65  sert( (pUpper->e
13c80 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
13c90 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a  T|WO_LE))!=0 );.
13ca0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13cb0 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
13cc0 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70  tValue(pParse, p
13cd0 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20  , &pRec, pExpr, 
13ce0 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b  aff, nEq, &bOk);
13cf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
13d00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f  =SQLITE_OK && bO
13d10 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  k ){.          t
13d20 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20  Rowcnt iNew;.   
13d30 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53         whereKeyS
13d40 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
13d50 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20  pRec, 1, a);.   
13d60 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b         iNew = a[
13d70 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d 3e 65  0] + ((pUpper->e
13d80 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
13d90 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20  ) ? a[1] : 0);. 
13da0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
13db0 77 3c 69 55 70 70 65 72 20 29 20 69 55 70 70 65  w<iUpper ) iUppe
13dc0 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  r = iNew;.      
13dd0 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20      nOut--;.    
13de0 20 20 20 20 20 20 70 55 70 70 65 72 20 3d 20 30        pUpper = 0
13df0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13e00 20 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 69 6c    }..      pBuil
13e10 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63  der->pRec = pRec
13e20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
13e30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13e40 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e       if( iUpper>
13e50 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  iLower ){.      
13e60 20 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74      nNew = sqlit
13e70 65 33 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20  e3LogEst(iUpper 
13e80 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20  - iLower);.     
13e90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13ea0 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20      nNew = 10;  
13eb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31 30        assert( 10
13ec0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
13ed0 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  2) );.        }.
13ee0 20 20 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77          if( nNew
13ef0 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20  <nOut ){.       
13f00 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a     nOut = nNew;.
13f10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13f20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
13f30 30 2c 20 28 22 53 54 41 54 34 20 72 61 6e 67 65  0, ("STAT4 range
13f40 20 73 63 61 6e 3a 20 25 75 2e 2e 25 75 20 20 65   scan: %u..%u  e
13f50 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  st=%d\n",.      
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72       (u32)iLower
13f80 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20 6e  , (u32)iUpper, n
13f90 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Out));.      }. 
13fa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13fb0 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 20  int bDone = 0;. 
13fc0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 52       rc = whereR
13fd0 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28  angeSkipScanEst(
13fe0 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2c 20  pParse, pLower, 
13ff0 70 55 70 70 65 72 2c 20 70 4c 6f 6f 70 2c 20 26  pUpper, pLoop, &
14000 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69 66  bDone);.      if
14010 28 20 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e  ( bDone ) return
14020 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23   rc;.    }.  }.#
14030 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
14040 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b  RAMETER(pParse);
14050 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
14060 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a 20  TER(pBuilder);. 
14070 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20   assert( pLower 
14080 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 23 65 6e  || pUpper );.#en
14090 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 55  dif.  assert( pU
140a0 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70  pper==0 || (pUpp
140b0 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  er->wtFlags & TE
140c0 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
140d0 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61    nNew = whereRa
140e0 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f 77 65 72  ngeAdjust(pLower
140f0 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65 77 20  , nOut);.  nNew 
14100 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  = whereRangeAdju
14110 73 74 28 70 55 70 70 65 72 2c 20 6e 4e 65 77 29  st(pUpper, nNew)
14120 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  ;..  /* TUNING: 
14130 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
14140 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f   an upper and lo
14150 77 65 72 20 6c 69 6d 69 74 2c 20 61 73 73 75 6d  wer limit, assum
14160 65 20 74 68 65 20 72 61 6e 67 65 20 69 73 0a 20  e the range is. 
14170 20 2a 2a 20 72 65 64 75 63 65 64 20 62 79 20 61   ** reduced by a
14180 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 37 35 25  n additional 75%
14190 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
141a0 74 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20 61  t, by default, a
141b0 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a 20 20 2a  n open-ended.  *
141c0 2a 20 72 61 6e 67 65 20 71 75 65 72 79 20 28 65  * range query (e
141d0 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20 69 73 20  .g. col > ?) is 
141e0 61 73 73 75 6d 65 64 20 74 6f 20 6d 61 74 63 68  assumed to match
141f0 20 31 2f 34 20 6f 66 20 74 68 65 20 72 6f 77 73   1/4 of the rows
14200 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   in the.  ** ind
14210 65 78 2e 20 57 68 69 6c 65 20 61 20 63 6c 6f 73  ex. While a clos
14220 65 64 20 72 61 6e 67 65 20 28 65 2e 67 2e 20 63  ed range (e.g. c
14230 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44  ol BETWEEN ? AND
14240 20 3f 29 20 69 73 20 65 73 74 69 6d 61 74 65 64   ?) is estimated
14250 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 31   to.  ** match 1
14260 2f 36 34 20 6f 66 20 74 68 65 20 69 6e 64 65 78  /64 of the index
14270 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70 4c 6f 77  . */ .  if( pLow
14280 65 72 20 26 26 20 70 55 70 70 65 72 20 29 20 6e  er && pUpper ) n
14290 4e 65 77 20 2d 3d 20 32 30 3b 0a 0a 20 20 6e 4f  New -= 20;..  nO
142a0 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30  ut -= (pLower!=0
142b0 29 20 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b  ) + (pUpper!=0);
142c0 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29  .  if( nNew<10 )
142d0 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66   nNew = 10;.  if
142e0 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f  ( nNew<nOut ) nO
142f0 75 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64  ut = nNew;.#if d
14300 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43  efined(WHERETRAC
14310 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28  E_ENABLED).  if(
14320 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75   pLoop->nOut>nOu
14330 74 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52  t ){.    WHERETR
14340 41 43 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65  ACE(0x10,("Range
14350 20 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75   scan lowers nOu
14360 74 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c  t from %d to %d\
14370 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
14380 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e          pLoop->n
14390 4f 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d  Out, nOut));.  }
143a0 0a 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d  .#endif.  pLoop-
143b0 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29  >nOut = (LogEst)
143c0 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72  nOut;.  return r
143d0 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
143e0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
143f0 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  _OR_STAT4./*.** 
14400 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  Estimate the num
14410 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
14420 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
14430 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e  d based on.** an
14440 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
14450 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64  aint x=VALUE and
14460 20 77 68 65 72 65 20 74 68 61 74 20 56 41 4c 55   where that VALU
14470 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74  E occurs in.** t
14480 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  he histogram dat
14490 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f  a.  This only wo
144a0 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74 68  rks when x is th
144b0 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63  e left-most.** c
144c0 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65  olumn of an inde
144d0 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61  x and sqlite_sta
144e0 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  t3 histogram dat
144f0 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a  a is available.*
14500 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78  * for that index
14510 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e  .  When pExpr==N
14520 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ULL that means t
14530 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
14540 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20  .** "x IS NULL" 
14550 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41  instead of "x=VA
14560 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  LUE"..**.** Writ
14570 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
14580 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
14590 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
145a0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
145b0 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
145c0 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
145d0 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
145e0 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
145f0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
14600 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14610 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
14620 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
14630 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
14640 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
14650 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
14660 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
14670 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
14680 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
14690 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
146a0 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
146b0 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
146c0 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
146d0 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
146e0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
146f0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 45  tatic int whereE
14700 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50  qualScanEst(.  P
14710 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
14720 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
14730 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
14740 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
14750 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
14760 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72  pBuilder,.  Expr
14770 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
14780 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
14790 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20  or VALUE in the 
147a0 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69  x=VALUE constrai
147b0 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  nt */.  tRowcnt 
147c0 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20  *pnRow       /* 
147d0 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
147e0 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
147f0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
14800 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  x *p = pBuilder-
14810 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70  >pNew->u.btree.p
14820 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71  Index;.  int nEq
14830 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
14840 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
14850 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
14860 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65   *pRec = pBuilde
14870 72 2d 3e 70 52 65 63 3b 0a 20 20 75 38 20 61 66  r->pRec;.  u8 af
14880 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
14890 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61       /* Column a
148a0 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74  ffinity */.  int
148b0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
148c0 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e         /* Subfun
148d0 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
148e0 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61  e */.  tRowcnt a
148f0 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [2];            
14900 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a   /* Statistics *
14910 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20  /.  int bOk;..  
14920 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20 29  assert( nEq>=1 )
14930 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3c  ;.  assert( nEq<
14940 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  =p->nColumn );. 
14950 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
14960 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ple!=0 );.  asse
14970 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  rt( p->nSample>0
14980 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
14990 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
149a0 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49  d<nEq );..  /* I
149b0 66 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74  f values are not
149c0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
149d0 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ll fields of the
149e0 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 65   index to the le
149f0 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20  ft.  ** of this 
14a00 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65  one, no estimate
14a10 20 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52 65   can be made. Re
14a20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
14a30 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70  OUND. */.  if( p
14a40 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
14a50 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20  id<(nEq-1) ){.  
14a60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14a70 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20  NOTFOUND;.  }.. 
14a80 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f   /* This is an o
14a90 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79  ptimization only
14aa0 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  . The call to sq
14ab0 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
14ac0 65 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62  etValue().  ** b
14ad0 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75 72  elow would retur
14ae0 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  n the same value
14af0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e  .  */.  if( nEq>
14b00 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  =p->nColumn ){. 
14b10 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20     *pnRow = 1;. 
14b20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14b30 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20  _OK;.  }..  aff 
14b40 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  = p->pTable->aCo
14b50 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  l[p->aiColumn[nE
14b60 71 2d 31 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  q-1]].affinity;.
14b70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
14b80 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
14b90 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
14ba0 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
14bb0 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20 70  Eq-1, &bOk);.  p
14bc0 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
14bd0 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63 21 3d  pRec;.  if( rc!=
14be0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
14bf0 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62 4f 6b  rn rc;.  if( bOk
14c00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
14c10 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
14c20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
14c30 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 77 68  lid = nEq;..  wh
14c40 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
14c50 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
14c60 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  a);.  WHERETRACE
14c70 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69 74 79  (0x10,("equality
14c80 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25   scan regions: %
14c90 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29  d\n", (int)a[1])
14ca0 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b  );.  *pnRow = a[
14cb0 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  1];.  .  return 
14cc0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
14cd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
14ce0 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
14cf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
14d00 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
14d10 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT4./*.** Estim
14d20 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
14d30 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
14d40 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73   be returned bas
14d50 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63  ed on.** an IN c
14d60 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65 20  onstraint where 
14d70 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
14d80 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  ide of the IN op
14d90 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c  erator.** is a l
14da0 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20  ist of values.  
14db0 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  Example:.**.**  
14dc0 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e        WHERE x IN
14dd0 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a   (1,2,3,4).**.**
14de0 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d   Write the estim
14df0 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69  ated row count i
14e00 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72  nto *pnRow and r
14e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
14e20 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74   .** If unable t
14e30 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61  o make an estima
14e40 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77  te, leave *pnRow
14e50 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72   unchanged and r
14e60 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
14e70 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  o..**.** This ro
14e80 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69  utine can fail i
14e90 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74  f it is unable t
14ea0 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69  o load a collati
14eb0 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72  ng sequence.** r
14ec0 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69  equired for stri
14ed0 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f  ng comparison, o
14ee0 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61  r if unable to a
14ef0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a  llocate memory.*
14f00 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76  * for a UTF conv
14f10 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ersion required 
14f20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  for comparison. 
14f30 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74   The error is st
14f40 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ored.** in the p
14f50 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
14f60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
14f70 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20  hereInScanEst(. 
14f80 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14f90 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
14fa0 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
14fb0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
14fc0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
14fd0 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78   *pBuilder,.  Ex
14fe0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
14ff0 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20     /* The value 
15000 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48 53 20  list on the RHS 
15010 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76 32 2c  of "x IN (v1,v2,
15020 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52  v3,...)" */.  tR
15030 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20  owcnt *pnRow    
15040 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
15050 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
15060 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
15070 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75    Index *p = pBu
15080 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
15090 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
150a0 36 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74  64 nRow0 = sqlit
150b0 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d  e3LogEstToInt(p-
150c0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29  >aiRowLogEst[0])
150d0 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69  ;.  int nRecVali
150e0 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  d = pBuilder->nR
150f0 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72  ecValid;.  int r
15100 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
15110 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
15120 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
15130 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b  .  tRowcnt nEst;
15140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
15150 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72  mber of rows for
15160 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a   a single term *
15170 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77  /.  tRowcnt nRow
15180 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  Est = 0;    /* N
15190 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ew estimate of t
151a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
151b0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
151c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
151d0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
151e0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
151f0 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20  aSample!=0 );.  
15200 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
15210 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73  ITE_OK && i<pLis
15220 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
15230 20 20 20 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30      nEst = nRow0
15240 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ;.    rc = where
15250 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61  EqualScanEst(pPa
15260 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
15270 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
15280 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52  , &nEst);.    nR
15290 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20  owEst += nEst;. 
152a0 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65     pBuilder->nRe
152b0 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c  cValid = nRecVal
152c0 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  id;.  }..  if( r
152d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
152e0 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20      if( nRowEst 
152f0 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f 77 45 73  > nRow0 ) nRowEs
15300 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a  t = nRow0;.    *
15310 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b  pnRow = nRowEst;
15320 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
15330 30 78 31 30 2c 28 22 49 4e 20 72 6f 77 20 65 73  0x10,("IN row es
15340 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 64 5c 6e  timate: est=%d\n
15350 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20  ", nRowEst));.  
15360 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69  }.  assert( pBui
15370 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d  lder->nRecValid=
15380 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20  =nRecValid );.  
15390 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
153a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
153b0 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
153c0 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69  AT4 */../*.** Di
153d0 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20  sable a term in 
153e0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
153f0 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  .  Except, do no
15400 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  t disable the te
15410 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74  rm.** if it cont
15420 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45  rols a LEFT OUTE
15430 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69  R JOIN and it di
15440 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20  d not originate 
15450 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20  in the ON.** or 
15460 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
15470 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  that join..**.**
15480 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65   Consider the te
15490 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20  rm t2.z='ok' in 
154a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  the following qu
154b0 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  eries:.**.**   (
154c0 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  1)  SELECT * FRO
154d0 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
154e0 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57  2 ON t1.a=t2.x W
154f0 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a  HERE t2.z='ok'.*
15500 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54 20  *   (2)  SELECT 
15510 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
15520 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
15530 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
15540 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45  '.**   (3)  SELE
15550 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
15560 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78   WHERE t1.a=t2.x
15570 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
15580 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f  *.** The t2.z='o
15590 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  k' is disabled i
155a0 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65 63  n the in (2) bec
155b0 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74  ause it originat
155c0 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  es.** in the ON 
155d0 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65 72  clause.  The ter
155e0 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  m is disabled in
155f0 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74 20   (3) because it 
15600 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f  is not part.** o
15610 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
15620 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68  OIN.  In (1), th
15630 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69  e term is not di
15640 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69  sabled..**.** Di
15650 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63  sabling a term c
15660 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d 20  auses that term 
15670 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  to not be tested
15680 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   in the inner lo
15690 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69  op.** of the joi
156a0 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73  n.  Disabling is
156b0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
156c0 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72  .  When terms ar
156d0 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62  e satisfied.** b
156e0 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69  y indices, we di
156f0 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72  sable them to pr
15700 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20  event redundant 
15710 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e  tests in the inn
15720 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20  er.** loop.  We 
15730 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f  would get the co
15740 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69 66  rrect results if
15750 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76   nothing were ev
15760 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20  er disabled,.** 
15770 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20  but joins might 
15780 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f  run a little slo
15790 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20  wer.  The trick 
157a0 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73  is to disable as
157b0 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63   much.** as we c
157c0 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61 62  an without disab
157d0 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20  ling too much.  
157e0 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20 69  If we disabled i
157f0 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a  n (1), we'd get.
15800 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73  ** the wrong ans
15810 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74  wer.  See ticket
15820 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63   #813..*/.static
15830 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72   void disableTer
15840 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c  m(WhereLevel *pL
15850 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20  evel, WhereTerm 
15860 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70  *pTerm){.  if( p
15870 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70  Term.      && (p
15880 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
15890 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20  TERM_CODED)==0. 
158a0 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
158b0 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c  >iLeftJoin==0 ||
158c0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
158d0 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
158e0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20  P_FromJoin)).   
158f0 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 6e     && (pLevel->n
15900 6f 74 52 65 61 64 79 20 26 20 70 54 65 72 6d 2d  otReady & pTerm-
15910 3e 70 72 65 72 65 71 41 6c 6c 29 3d 3d 30 0a 20  >prereqAll)==0. 
15920 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77   ){.    pTerm->w
15930 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
15940 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54  ODED;.    if( pT
15950 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20  erm->iParent>=0 
15960 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
15970 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54  rm *pOther = &pT
15980 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
15990 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
159a0 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72     if( (--pOther
159b0 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a  ->nChild)==0 ){.
159c0 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
159d0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68  erm(pLevel, pOth
159e0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
159f0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
15a00 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e  Code an OP_Affin
15a10 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70  ity opcode to ap
15a20 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  ply the column a
15a30 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a  ffinity string z
15a40 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20  Aff.** to the n 
15a50 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
15a60 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a  ng at base. .**.
15a70 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ** As an optimiz
15a80 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46  ation, SQLITE_AF
15a90 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28  F_NONE entries (
15aa0 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73  which are no-ops
15ab0 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69  ) at the.** begi
15ac0 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66  nning and end of
15ad0 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65   zAff are ignore
15ae0 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69  d.  If all entri
15af0 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a  es in zAff are.*
15b00 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
15b10 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20  E, then no code 
15b20 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a  gets generated..
15b30 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
15b40 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e  ne makes its own
15b50 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f   copy of zAff so
15b60 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
15b70 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d   is free.** to m
15b80 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72  odify zAff after
15b90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
15ba0 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  turns..*/.static
15bb0 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41   void codeApplyA
15bc0 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
15bd0 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c  Parse, int base,
15be0 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41   int n, char *zA
15bf0 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ff){.  Vdbe *v =
15c00 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
15c10 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b    if( zAff==0 ){
15c20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
15c30 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
15c40 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74  ailed );.    ret
15c50 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
15c60 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  t( v!=0 );..  /*
15c70 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64   Adjust base and
15c80 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20   n to skip over 
15c90 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
15ca0 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62  entries at the b
15cb0 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e  eginning.  ** an
15cc0 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66  d end of the aff
15cd0 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20  inity string..  
15ce0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  */.  while( n>0 
15cf0 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49  && zAff[0]==SQLI
15d00 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
15d10 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65     n--;.    base
15d20 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a  ++;.    zAff++;.
15d30 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31    }.  while( n>1
15d40 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53   && zAff[n-1]==S
15d50 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
15d60 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a  {.    n--;.  }..
15d70 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50    /* Code the OP
15d80 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65  _Affinity opcode
15d90 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
15da0 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f  thing left to do
15db0 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29  . */.  if( n>0 )
15dc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
15dd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66  eAddOp2(v, OP_Af
15de0 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29  finity, base, n)
15df0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15e00 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
15e10 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73   zAff, n);.    s
15e20 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
15e30 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
15e40 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  arse, base, n);.
15e50 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
15e60 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
15e70 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74  a single equalit
15e80 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  y term of the WH
15e90 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20  ERE clause.  An 
15ea0 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d  equality.** term
15eb0 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58   can be either X
15ec0 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e  =expr or X IN (.
15ed0 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20  ..).   pTerm is 
15ee0 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a  the term to be .
15ef0 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  ** coded..**.** 
15f00 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
15f10 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72  e for the constr
15f20 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20  aint is left in 
15f30 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a  register iReg..*
15f40 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74  *.** For a const
15f50 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72  raint of the for
15f60 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78  m X=expr, the ex
15f70 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c  pression is eval
15f80 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a  uated and its.**
15f90 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20   result is left 
15fa0 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46  on the stack.  F
15fb0 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  or constraints o
15fc0 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20  f the form X IN 
15fd0 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f  (...).** this ro
15fe0 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
15ff0 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69  loop that will i
16000 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20  terate over all 
16010 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a  values of X..*/.
16020 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45  static int codeE
16030 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50  qualityTerm(.  P
16040 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
16050 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
16060 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
16070 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
16080 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f     /* The term o
16090 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
160a0 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  se to be coded *
160b0 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
160c0 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c  pLevel, /* The l
160d0 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d  evel of the FROM
160e0 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77   clause we are w
160f0 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69  orking on */.  i
16100 6e 74 20 69 45 71 2c 20 20 20 20 20 20 20 20 20  nt iEq,         
16110 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
16120 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  he equality term
16130 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76   within this lev
16140 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  el */.  int bRev
16150 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
16160 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d  rue for reverse-
16170 6f 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69  order IN operati
16180 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
16190 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20  rget         /* 
161a0 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65  Attempt to leave
161b0 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73   results in this
161c0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
161d0 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
161e0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62  rm->pExpr;.  Vdb
161f0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
16200 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67  Vdbe;.  int iReg
16210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16220 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
16230 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  olding results *
16240 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61  /..  assert( iTa
16250 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20  rget>0 );.  if( 
16260 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b  pX->op==TK_EQ ){
16270 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
16280 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
16290 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  t(pParse, pX->pR
162a0 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
162b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e    }else if( pX->
162c0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
162d0 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
162e0 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  get;.    sqlite3
162f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16300 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b  _Null, 0, iReg);
16310 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16320 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
16330 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65  }else{.    int e
16340 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54  Type;.    int iT
16350 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  ab;.    struct I
16360 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
16370 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
16380 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
16390 70 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  p;..    if( (pLo
163a0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
163b0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
163c0 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c  )==0.      && pL
163d0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
163e0 64 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20  dex!=0.      && 
163f0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
16400 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
16410 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20  r[iEq].    ){.  
16420 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 45      testcase( iE
16430 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  q==0 );.      te
16440 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a  stcase( bRev );.
16450 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52        bRev = !bR
16460 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ev;.    }.    as
16470 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
16480 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20  _IN );.    iReg 
16490 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65  = iTarget;.    e
164a0 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
164b0 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
164c0 2c 20 70 58 2c 20 49 4e 5f 49 4e 44 45 58 5f 4c  , pX, IN_INDEX_L
164d0 4f 4f 50 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  OOP, 0);.    if(
164e0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
164f0 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20  _INDEX_DESC ){. 
16500 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62       testcase( b
16510 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65  Rev );.      bRe
16520 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d  v = !bRev;.    }
16530 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e  .    iTab = pX->
16540 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69  iTable;.    sqli
16550 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16560 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20   bRev ? OP_Last 
16570 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  : OP_Rewind, iTa
16580 62 2c 20 30 29 3b 0a 20 20 20 20 56 64 62 65 43  b, 0);.    VdbeC
16590 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
165a0 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  v);.    VdbeCove
165b0 72 61 67 65 49 66 28 76 2c 20 21 62 52 65 76 29  rageIf(v, !bRev)
165c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
165d0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
165e0 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d  WHERE_MULTI_OR)=
165f0 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  =0 );.    pLoop-
16600 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
16610 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20 69  E_IN_ABLE;.    i
16620 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  f( pLevel->u.in.
16630 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nIn==0 ){.      
16640 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20  pLevel->addrNxt 
16650 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
16660 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d  eLabel(v);.    }
16670 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  .    pLevel->u.i
16680 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65  n.nIn++;.    pLe
16690 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
166a0 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74  p =.       sqlit
166b0 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
166c0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
166d0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
166e0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
166f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16700 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d    sizeof(pLevel-
16710 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d  >u.in.aInLoop[0]
16720 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  )*pLevel->u.in.n
16730 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70  In);.    pIn = p
16740 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
16750 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  oop;.    if( pIn
16760 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d   ){.      pIn +=
16770 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
16780 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e  n - 1;.      pIn
16790 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20  ->iCur = iTab;. 
167a0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
167b0 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29  IN_INDEX_ROWID )
167c0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61  {.        pIn->a
167d0 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74  ddrInTop = sqlit
167e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
167f0 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20  OP_Rowid, iTab, 
16800 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  iReg);.      }el
16810 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d  se{.        pIn-
16820 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c  >addrInTop = sql
16830 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
16840 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61  , OP_Column, iTa
16850 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20  b, 0, iReg);.   
16860 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d 3e     }.      pIn->
16870 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65  eEndLoopOp = bRe
16880 76 20 3f 20 4f 50 5f 50 72 65 76 49 66 4f 70 65  v ? OP_PrevIfOpe
16890 6e 20 3a 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65  n : OP_NextIfOpe
168a0 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  n;.      sqlite3
168b0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
168c0 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 20  _IsNull, iReg); 
168d0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
168e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
168f0 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e    pLevel->u.in.n
16900 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65  In = 0;.    }.#e
16910 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62  ndif.  }.  disab
16920 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
16930 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  Term);.  return 
16940 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  iReg;.}../*.** G
16950 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
16960 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
16970 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f  all == and IN co
16980 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e  nstraints for an
16990 0a 2a 2a 20 69 6e 64 65 78 20 73 63 61 6e 2e 0a  .** index scan..
169a0 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
169b0 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c  e, consider tabl
169c0 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  e t1(a,b,c,d,e,f
169d0 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28  ) with index i1(
169e0 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f  a,b,c)..** Suppo
169f0 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  se the WHERE cla
16a00 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d  use is this:  a=
16a10 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32  =5 AND b IN (1,2
16a20 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20  ,3) AND c>5 AND 
16a30 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65  c<10.** The inde
16a40 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73  x has as many as
16a50 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20   three equality 
16a60 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74  constraints, but
16a70 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d   in this.** exam
16a80 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22  ple, the third "
16a90 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69  c" value is an i
16aa0 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f  nequality.  So o
16ab0 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73  nly two .** cons
16ac0 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65  traints are code
16ad0 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
16ae0 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63   will generate c
16af0 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a  ode to evaluate.
16b00 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e  ** a==5 and b IN
16b10 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63   (1,2,3).  The c
16b20 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f  urrent values fo
16b30 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62  r a and b will b
16b40 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63  e stored.** in c
16b50 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
16b60 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64  ters and the ind
16b70 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ex of the first 
16b80 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75  register is retu
16b90 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  rned..**.** In t
16ba0 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
16bb0 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68   nEq==2.  But th
16bc0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f  is subroutine wo
16bd0 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75  rks for any valu
16be0 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c  e.** of nEq incl
16bf0 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71  uding 0.  If nEq
16c00 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ==0, this routin
16c10 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f  e is nearly a no
16c20 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  -op..** The only
16c30 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69   thing it does i
16c40 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70  s allocate the p
16c50 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f  Level->iMem memo
16c60 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63  ry cell and.** c
16c70 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69 6e  ompute the affin
16c80 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ity string..**.*
16c90 2a 20 54 68 65 20 6e 45 78 74 72 61 52 65 67 20  * The nExtraReg 
16ca0 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 6f  parameter is 0 o
16cb0 72 20 31 2e 20 20 49 74 20 69 73 20 30 20 69 66  r 1.  It is 0 if
16cc0 20 61 6c 6c 20 57 48 45 52 45 20 63 6c 61 75 73   all WHERE claus
16cd0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  e constraints.**
16ce0 20 61 72 65 20 3d 3d 20 6f 72 20 49 4e 20 61 6e   are == or IN an
16cf0 64 20 61 72 65 20 63 6f 76 65 72 65 64 20 62 79  d are covered by
16d00 20 74 68 65 20 6e 45 71 2e 20 20 6e 45 78 74 72   the nEq.  nExtr
16d10 61 52 65 67 20 69 73 20 31 20 69 66 20 74 68 65  aReg is 1 if the
16d20 72 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 65 71  re is.** an ineq
16d30 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
16d40 74 20 28 73 75 63 68 20 61 73 20 74 68 65 20 22  t (such as the "
16d50 63 3e 3d 35 20 41 4e 44 20 63 3c 31 30 22 20 69  c>=5 AND c<10" i
16d60 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20 74  n the example) t
16d70 68 61 74 0a 2a 2a 20 6f 63 63 75 72 73 20 61 66  hat.** occurs af
16d80 74 65 72 20 74 68 65 20 6e 45 71 20 71 75 61 6c  ter the nEq qual
16d90 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
16da0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
16db0 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ine allocates a 
16dc0 72 61 6e 67 65 20 6f 66 20 6e 45 71 2b 6e 45 78  range of nEq+nEx
16dd0 74 72 61 52 65 67 20 6d 65 6d 6f 72 79 20 63 65  traReg memory ce
16de0 6c 6c 73 20 61 6e 64 20 72 65 74 75 72 6e 73 0a  lls and returns.
16df0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ** the index of 
16e00 74 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72 79  the first memory
16e10 20 63 65 6c 6c 20 69 6e 20 74 68 61 74 20 72 61   cell in that ra
16e20 6e 67 65 2e 20 54 68 65 20 63 6f 64 65 20 74 68  nge. The code th
16e30 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73  at.** calls this
16e40 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73   routine will us
16e50 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 72 61  e that memory ra
16e60 6e 67 65 20 74 6f 20 73 74 6f 72 65 20 6b 65 79  nge to store key
16e70 73 20 66 6f 72 0a 2a 2a 20 73 74 61 72 74 20 61  s for.** start a
16e80 6e 64 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  nd termination c
16e90 6f 6e 64 69 74 69 6f 6e 73 20 6f 66 20 74 68 65  onditions of the
16ea0 20 6c 6f 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76 61   loop..** key va
16eb0 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  lue of the loop.
16ec0 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    If one or more
16ed0 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70   IN operators ap
16ee0 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  pear, then.** th
16ef0 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
16f00 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e  ates an addition
16f10 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65  al nEq memory ce
16f20 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  lls for internal
16f30 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42  .** use..**.** B
16f40 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
16f50 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20 74   *pzAff is set t
16f60 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
16f70 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
16f80 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20  .** copy of the 
16f90 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  column affinity 
16fa0 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  string of the in
16fb0 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  dex allocated us
16fc0 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62  ing.** sqlite3Db
16fd0 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74  Malloc(). Except
16fe0 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  , entries in the
16ff0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72   copy of the str
17000 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ing associated.*
17010 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74 79 20  * with equality 
17020 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74  constraints that
17030 20 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69   use NONE affini
17040 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a  ty are set to.**
17050 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
17060 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64 65 61  . This is to dea
17070 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63 68 20  l with SQL such 
17080 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  as the following
17090 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
170a0 20 54 41 42 4c 45 20 74 31 28 61 20 54 45 58 54   TABLE t1(a TEXT
170b0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
170c0 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e  ;.**   SELECT ..
170d0 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c  . FROM t1 AS t2,
170e0 20 74 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d   t1 WHERE t1.a =
170f0 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20   t2.b;.**.** In 
17100 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
17110 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  e, the index on 
17120 74 31 28 61 29 20 68 61 73 20 54 45 58 54 20 61  t1(a) has TEXT a
17130 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e  ffinity. But sin
17140 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20  ce.** the right 
17150 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
17160 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
17170 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20  aint (t2.b) has 
17180 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a  NONE affinity,.*
17190 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20  * no conversion 
171a0 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70  should be attemp
171b0 74 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67  ted before using
171c0 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73   a t2.b value as
171d0 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65   part of.** a ke
171e0 79 20 74 6f 20 73 65 61 72 63 68 20 74 68 65 20  y to search the 
171f0 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65  index. Hence the
17200 20 66 69 72 73 74 20 62 79 74 65 20 69 6e 20 74   first byte in t
17210 68 65 20 72 65 74 75 72 6e 65 64 20 61 66 66 69  he returned affi
17220 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69  nity.** string i
17230 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77  n this example w
17240 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53  ould be set to S
17250 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a  QLITE_AFF_NONE..
17260 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
17270 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
17280 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ms(.  Parse *pPa
17290 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
172a0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
172b0 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
172c0 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69  pLevel,   /* Whi
172d0 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  ch nested loop o
172e0 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72  f the FROM we ar
172f0 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  e coding */.  in
17300 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20  t bRev,         
17310 20 20 20 20 2f 2a 20 52 65 76 65 72 73 65 20 74      /* Reverse t
17320 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f  he order of IN o
17330 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
17340 74 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20  t nExtraReg,    
17350 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17360 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73   extra registers
17370 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
17380 20 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20    char **pzAff  
17390 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
173a0 53 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  Set to point to 
173b0 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
173c0 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 45 71 3b  */.){.  u16 nEq;
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
173f0 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20  ber of == or IN 
17400 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63  constraints to c
17410 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6e 53 6b  ode */.  u16 nSk
17420 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ip;             
17430 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17440 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f   of left-most co
17450 6c 75 6d 6e 73 20 74 6f 20 73 6b 69 70 20 2a 2f  lumns to skip */
17460 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
17470 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
17480 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72   /* The vm under
17490 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
174a0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
174b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174c0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65   /* The index be
174d0 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69  ing used for thi
174e0 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72  s loop */.  Wher
174f0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
17500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
17510 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74  ingle constraint
17520 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65   term */.  Where
17530 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
17540 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17550 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
17560 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
17570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17580 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
17590 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
175a0 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
175b0 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
175c0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
175d0 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   nReg;          
175e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
175f0 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72  mber of register
17600 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
17610 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20  .  char *zAff;  
17620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17630 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72   /* Affinity str
17640 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ing to return */
17650 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75  ..  /* This modu
17660 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  le is only calle
17670 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73  d on query plans
17680 20 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64   that use an ind
17690 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d  ex. */.  pLoop =
176a0 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
176b0 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f  .  assert( (pLoo
176c0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
176d0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
176e0 3d 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70  ==0 );.  nEq = p
176f0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
17700 71 3b 0a 20 20 6e 53 6b 69 70 20 3d 20 70 4c 6f  q;.  nSkip = pLo
17710 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  op->u.btree.nSki
17720 70 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f  p;.  pIdx = pLoo
17730 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
17740 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  x;.  assert( pId
17750 78 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  x!=0 );..  /* Fi
17760 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
17770 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77  y memory cells w
17780 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e  e will need then
17790 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a   allocate them..
177a0 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d    */.  regBase =
177b0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
177c0 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f  1;.  nReg = pLoo
177d0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b  p->u.btree.nEq +
177e0 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50   nExtraReg;.  pP
177f0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
17800 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71  eg;..  zAff = sq
17810 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50  lite3DbStrDup(pP
17820 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65  arse->db, sqlite
17830 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
17840 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69  r(v, pIdx));.  i
17850 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20  f( !zAff ){.    
17860 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
17870 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
17880 7d 0a 0a 20 20 69 66 28 20 6e 53 6b 69 70 20 29  }..  if( nSkip )
17890 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  {.    int iIdxCu
178a0 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
178b0 43 75 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Cur;.    sqlite3
178c0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 28 62  VdbeAddOp1(v, (b
178d0 52 65 76 3f 4f 50 5f 4c 61 73 74 3a 4f 50 5f 52  Rev?OP_Last:OP_R
178e0 65 77 69 6e 64 29 2c 20 69 49 64 78 43 75 72 29  ewind), iIdxCur)
178f0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
17900 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29  geIf(v, bRev==0)
17910 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
17920 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29  geIf(v, bRev!=0)
17930 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
17940 74 28 28 76 2c 20 22 62 65 67 69 6e 20 73 6b 69  t((v, "begin ski
17950 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70  p-scan on %s", p
17960 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
17970 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 56 64 62    j = sqlite3Vdb
17980 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
17990 74 6f 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  to);.    pLevel-
179a0 3e 61 64 64 72 53 6b 69 70 20 3d 20 73 71 6c 69  >addrSkip = sqli
179b0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
179c0 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f 53 65 65  (v, (bRev?OP_See
179d0 6b 4c 54 3a 4f 50 5f 53 65 65 6b 47 54 29 2c 0a  kLT:OP_SeekGT),.
179e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179f0 20 20 20 20 20 20 20 20 20 20 20 20 69 49 64 78              iIdx
17a00 43 75 72 2c 20 30 2c 20 72 65 67 42 61 73 65 2c  Cur, 0, regBase,
17a10 20 6e 53 6b 69 70 29 3b 0a 20 20 20 20 56 64 62   nSkip);.    Vdb
17a20 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
17a30 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62  Rev==0);.    Vdb
17a40 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
17a50 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 73 71 6c  Rev!=0);.    sql
17a60 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
17a70 28 76 2c 20 6a 29 3b 0a 20 20 20 20 66 6f 72 28  (v, j);.    for(
17a80 6a 3d 30 3b 20 6a 3c 6e 53 6b 69 70 3b 20 6a 2b  j=0; j<nSkip; j+
17a90 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
17aa0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
17ab0 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
17ac0 72 2c 20 6a 2c 20 72 65 67 42 61 73 65 2b 6a 29  r, j, regBase+j)
17ad0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17ae0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
17af0 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 56 64  ]>=0 );.      Vd
17b00 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
17b10 73 22 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  s", pIdx->pTable
17b20 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43  ->aCol[pIdx->aiC
17b30 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 29  olumn[j]].zName)
17b40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 20  );.    }.  }    
17b50 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20  ..  /* Evaluate 
17b60 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
17b70 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
17b80 61 73 73 65 72 74 28 20 7a 41 66 66 3d 3d 30 20  assert( zAff==0 
17b90 7c 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  || (int)strlen(z
17ba0 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 66  Aff)>=nEq );.  f
17bb0 6f 72 28 6a 3d 6e 53 6b 69 70 3b 20 6a 3c 6e 45  or(j=nSkip; j<nE
17bc0 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  q; j++){.    int
17bd0 20 72 31 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d   r1;.    pTerm =
17be0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
17bf0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
17c00 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f  Term!=0 );.    /
17c10 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
17c20 74 65 73 74 63 61 73 65 20 69 73 20 74 72 75 65  testcase is true
17c30 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74   for indices wit
17c40 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75  h redundant colu
17c50 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a  mns. .    ** Ex:
17c60 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
17c70 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53   ON t1(a,b,a); S
17c80 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
17c90 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d  WHERE a=0 AND b=
17ca0 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61  0; */.    testca
17cb0 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  se( (pTerm->wtFl
17cc0 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
17cd0 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  )!=0 );.    test
17ce0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
17cf0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
17d00 55 41 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d 20  UAL );.    r1 = 
17d10 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
17d20 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
17d30 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c  pLevel, j, bRev,
17d40 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
17d50 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73 65   if( r1!=regBase
17d60 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  +j ){.      if( 
17d70 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nReg==1 ){.     
17d80 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17d90 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17da0 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20   regBase);.     
17db0 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b     regBase = r1;
17dc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17de0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
17df0 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65  opy, r1, regBase
17e00 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
17e10 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
17e20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
17e30 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
17e40 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
17e50 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
17e60 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69  & WO_IN );.    i
17e70 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
17e80 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
17e90 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a  L|WO_IN))==0 ){.
17ea0 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
17eb0 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  ht = pTerm->pExp
17ec0 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
17ed0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
17ee0 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74  CanBeNull(pRight
17ef0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
17f00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17f10 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67  , OP_IsNull, reg
17f20 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e  Base+j, pLevel->
17f30 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20  addrBrk);.      
17f40 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
17f50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17f60 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20   if( zAff ){.   
17f70 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
17f80 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
17f90 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29  pRight, zAff[j])
17fa0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
17fb0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  E ){.          z
17fc0 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
17fd0 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
17fe0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
17ff0 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
18000 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
18010 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d  (pRight, zAff[j]
18020 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
18030 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
18040 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
18050 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
18060 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d  }.  }.  *pzAff =
18070 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20   zAff;.  return 
18080 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e  regBase;.}..#ifn
18090 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
180a0 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68  EXPLAIN./*.** Th
180b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
180c0 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61  helper for expla
180d0 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62  inIndexRange() b
180e0 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20  elow.**.** pStr 
180f0 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f  holds the text o
18100 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
18110 74 68 61 74 20 77 65 20 61 72 65 20 62 75 69 6c  that we are buil
18120 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d  ding up one term
18130 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20  .** at a time.  
18140 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
18150 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  s a new term to 
18160 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65  the end of the e
18170 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65  xpression..** Te
18180 72 6d 73 20 61 72 65 20 73 65 70 61 72 61 74 65  rms are separate
18190 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20  d by AND so add 
181a0 74 68 65 20 22 41 4e 44 22 20 74 65 78 74 20 66  the "AND" text f
181b0 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75  or second and su
181c0 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d  bsequent.** term
181d0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  s only..*/.stati
181e0 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70  c void explainAp
181f0 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41  pendTerm(.  StrA
18200 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20  ccum *pStr,     
18210 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
18220 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ext expression b
18230 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20  eing built */.  
18240 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20 20  int iTerm,      
18250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
18260 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74 65 72  ndex of this ter
18270 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65 72  m.  First is zer
18280 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  o */.  const cha
18290 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  r *zColumn,     
182a0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
182b0 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  e column */.  co
182c0 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20 20  nst char *zOp   
182d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
182e0 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
182f0 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54  r */.){.  if( iT
18300 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74 72  erm ) sqlite3Str
18310 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
18320 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20  , " AND ", 5);. 
18330 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
18340 41 70 70 65 6e 64 41 6c 6c 28 70 53 74 72 2c 20  AppendAll(pStr, 
18350 7a 43 6f 6c 75 6d 6e 29 3b 0a 20 20 73 71 6c 69  zColumn);.  sqli
18360 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
18370 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29 3b  d(pStr, zOp, 1);
18380 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
18390 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22  umAppend(pStr, "
183a0 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ?", 1);.}../*.**
183b0 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65 6c   Argument pLevel
183c0 20 64 65 73 63 72 69 62 65 73 20 61 20 73 74 72   describes a str
183d0 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e 69  ategy for scanni
183e0 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20 54  ng table pTab. T
183f0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
18400 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
18410 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 62  er to a string b
18420 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
18430 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a   a description.*
18440 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65 74 20  * of the subset 
18450 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20 73 63  of table rows sc
18460 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74 72  anned by the str
18470 61 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f 72  ategy in the for
18480 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20 65  m of an.** SQL e
18490 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20 69  xpression. Or, i
184a0 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 73  f all rows are s
184b0 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73 20  canned, NULL is 
184c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
184d0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
184e0 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  the query:.**.**
184f0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
18500 20 74 31 20 57 48 45 52 45 20 61 3d 31 20 41 4e   t1 WHERE a=1 AN
18510 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20  D b>2;.**.** is 
18520 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20 69 73  run and there is
18530 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c   an index on (a,
18540 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66   b), then this f
18550 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
18560 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d 69  a.** string simi
18570 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  lar to:.**.**   
18580 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a  "a=? AND b>?".**
18590 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
185a0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
185b0 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
185c0 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
185d0 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74  bMalloc()..** It
185e0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
185f0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
18600 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68 65  ller to free the
18610 20 62 75 66 66 65 72 20 77 68 65 6e 20 69 74 20   buffer when it 
18620 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20  is.** no longer 
18630 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
18640 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c 61 69  tic char *explai
18650 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71 6c 69  nIndexRange(sqli
18660 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
18670 6f 70 20 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c 65  op *pLoop, Table
18680 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78   *pTab){.  Index
18690 20 2a 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70   *pIndex = pLoop
186a0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
186b0 3b 0a 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c  ;.  u16 nEq = pL
186c0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
186d0 3b 0a 20 20 75 31 36 20 6e 53 6b 69 70 20 3d 20  ;.  u16 nSkip = 
186e0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
186f0 53 6b 69 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Skip;.  int i, j
18700 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  ;.  Column *aCol
18710 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20   = pTab->aCol;. 
18720 20 69 31 36 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d   i16 *aiColumn =
18730 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
18740 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 74 78  n;.  StrAccum tx
18750 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30  t;..  if( nEq==0
18760 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
18770 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d  ags & (WHERE_BTM
18780 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
18790 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20  _LIMIT))==0 ){. 
187a0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
187b0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
187c0 75 6d 49 6e 69 74 28 26 74 78 74 2c 20 30 2c 20  umInit(&txt, 0, 
187d0 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  0, SQLITE_MAX_LE
187e0 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e 64 62 20  NGTH);.  txt.db 
187f0 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 53  = db;.  sqlite3S
18800 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74  trAccumAppend(&t
18810 78 74 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20  xt, " (", 2);.  
18820 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20  for(i=0; i<nEq; 
18830 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  i++){.    char *
18840 7a 20 3d 20 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  z = aiColumn[i] 
18850 3c 20 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  < 0 ? "rowid" : 
18860 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d  aCol[aiColumn[i]
18870 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
18880 20 69 3e 3d 6e 53 6b 69 70 20 29 7b 0a 20 20 20   i>=nSkip ){.   
18890 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
188a0 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c  Term(&txt, i, z,
188b0 20 22 3d 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65   "=");.    }else
188c0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29 20  {.      if( i ) 
188d0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
188e0 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20 41 4e  ppend(&txt, " AN
188f0 44 20 22 2c 20 35 29 3b 0a 20 20 20 20 20 20 73  D ", 5);.      s
18900 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
18910 70 65 6e 64 28 26 74 78 74 2c 20 22 41 4e 59 28  pend(&txt, "ANY(
18920 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 4);.      sql
18930 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
18940 6e 64 41 6c 6c 28 26 74 78 74 2c 20 7a 29 3b 0a  ndAll(&txt, z);.
18950 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
18960 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74  AccumAppend(&txt
18970 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 7d  , ")", 1);.    }
18980 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20  .  }..  j = i;. 
18990 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
189a0 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ags&WHERE_BTM_LI
189b0 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20  MIT ){.    char 
189c0 2a 7a 20 3d 20 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  *z = aiColumn[j]
189d0 20 3c 20 30 20 3f 20 22 72 6f 77 69 64 22 20 3a   < 0 ? "rowid" :
189e0 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a   aCol[aiColumn[j
189f0 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78  ]].zName;.    ex
18a00 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
18a10 26 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e  &txt, i++, z, ">
18a20 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c  ");.  }.  if( pL
18a30 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  oop->wsFlags&WHE
18a40 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
18a50 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 69      char *z = ai
18a60 43 6f 6c 75 6d 6e 5b 6a 5d 20 3c 20 30 20 3f 20  Column[j] < 0 ? 
18a70 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61  "rowid" : aCol[a
18a80 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d  iColumn[j]].zNam
18a90 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70  e;.    explainAp
18aa0 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69  pendTerm(&txt, i
18ab0 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20  , z, "<");.  }. 
18ac0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
18ad0 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 29 22  Append(&txt, ")"
18ae0 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  , 1);.  return s
18af0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
18b00 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f  nish(&txt);.}../
18b10 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
18b20 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  on is a no-op un
18b30 6c 65 73 73 20 63 75 72 72 65 6e 74 6c 79 20 70  less currently p
18b40 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 45 58 50  rocessing an EXP
18b50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a  LAIN QUERY PLAN.
18b60 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20 74  ** command. If t
18b70 68 65 20 71 75 65 72 79 20 62 65 69 6e 67 20 63  he query being c
18b80 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e 20 45 58  ompiled is an EX
18b90 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
18ba0 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 65  , a single.** re
18bb0 63 6f 72 64 20 69 73 20 61 64 64 65 64 20 74 6f  cord is added to
18bc0 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f 20 64   the output to d
18bd0 65 73 63 72 69 62 65 20 74 68 65 20 74 61 62 6c  escribe the tabl
18be0 65 20 73 63 61 6e 20 73 74 72 61 74 65 67 79 20  e scan strategy 
18bf0 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a  in .** pLevel..*
18c00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
18c10 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20  plainOneScan(.  
18c20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
18c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c40 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
18c50 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
18c60 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20  TabList,        
18c70 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c        /* Table l
18c80 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65  ist this loop re
18c90 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65  fers to */.  Whe
18ca0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
18cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18cc0 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50  Scan to write OP
18cd0 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20  _Explain opcode 
18ce0 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  for */.  int iLe
18cf0 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
18d00 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
18d10 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f  e for "level" co
18d20 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a  lumn of output *
18d30 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
18d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d50 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
18d60 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f   "from" column o
18d70 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75 31  f output */.  u1
18d80 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20  6 wctrlFlags    
18d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18da0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   Flags passed to
18db0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
18dc0 69 6e 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  in() */.){.#ifnd
18dd0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
18de0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
18df0 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65 6e 64 69  plain==2 ).#endi
18e00 66 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74  f.  {.    struct
18e10 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
18e20 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
18e30 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
18e40 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20  m];.    Vdbe *v 
18e50 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
18e60 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e        /* VM bein
18e70 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f  g constructed */
18e80 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
18e90 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
18ea0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
18eb0 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61  andle */.    cha
18ec0 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20 20  r *zMsg;        
18ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
18ee0 78 74 20 74 6f 20 61 64 64 20 74 6f 20 45 51 50  xt to add to EQP
18ef0 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69   output */.    i
18f00 6e 74 20 69 49 64 20 3d 20 70 50 61 72 73 65 2d  nt iId = pParse-
18f10 3e 69 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20  >iSelectId;  /* 
18f20 53 65 6c 65 63 74 20 69 64 20 28 6c 65 66 74 2d  Select id (left-
18f30 6d 6f 73 74 20 6f 75 74 70 75 74 20 63 6f 6c 75  most output colu
18f40 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  mn) */.    int i
18f50 73 53 65 61 72 63 68 3b 20 20 20 20 20 20 20 20  sSearch;        
18f60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
18f70 20 66 6f 72 20 61 20 53 45 41 52 43 48 2e 20 46   for a SEARCH. F
18f80 61 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a  alse for SCAN. *
18f90 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20  /.    WhereLoop 
18fa0 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
18fb0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72      /* The contr
18fc0 6f 6c 6c 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  olling WhereLoop
18fd0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75   object */.    u
18fe0 33 32 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  32 flags;       
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19000 46 6c 61 67 73 20 74 68 61 74 20 64 65 73 63 72  Flags that descr
19010 69 62 65 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f  ibe this loop */
19020 0a 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ..    pLoop = pL
19030 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
19040 20 20 66 6c 61 67 73 20 3d 20 70 4c 6f 6f 70 2d    flags = pLoop-
19050 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 69 66  >wsFlags;.    if
19060 28 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 4d  ( (flags&WHERE_M
19070 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74  ULTI_OR) || (wct
19080 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e  rlFlags&WHERE_ON
19090 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29 20 72  ETABLE_ONLY) ) r
190a0 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 73 53 65  eturn;..    isSe
190b0 61 72 63 68 20 3d 20 28 66 6c 61 67 73 26 28 57  arch = (flags&(W
190c0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57  HERE_BTM_LIMIT|W
190d0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29  HERE_TOP_LIMIT))
190e0 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
190f0 7c 7c 20 28 28 66 6c 61 67 73 26 57 48 45 52 45  || ((flags&WHERE
19100 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
19110 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62  0 && (pLoop->u.b
19120 74 72 65 65 2e 6e 45 71 3e 30 29 29 0a 20 20 20  tree.nEq>0)).   
19130 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74           || (wct
19140 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f  rlFlags&(WHERE_O
19150 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45  RDERBY_MIN|WHERE
19160 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a  _ORDERBY_MAX));.
19170 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
19180 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
19190 25 73 22 2c 20 69 73 53 65 61 72 63 68 3f 22 53  %s", isSearch?"S
191a0 45 41 52 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a  EARCH":"SCAN");.
191b0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
191c0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
191d0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
191e0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
191f0 20 22 25 73 20 53 55 42 51 55 45 52 59 20 25 64   "%s SUBQUERY %d
19200 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69  ", zMsg,pItem->i
19210 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d  SelectId);.    }
19220 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67  else{.      zMsg
19230 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
19240 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
19250 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67   TABLE %s", zMsg
19260 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
19270 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
19280 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
19290 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
192a0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
192b0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25  , zMsg, "%s AS %
192c0 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d  s", zMsg, pItem-
192d0 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a  >zAlias);.    }.
192e0 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
192f0 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52   (WHERE_IPK|WHER
19300 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29  E_VIRTUALTABLE))
19310 3d 3d 30 0a 20 20 20 20 20 26 26 20 41 4c 57 41  ==0.     && ALWA
19320 59 53 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  YS(pLoop->u.btre
19330 65 2e 70 49 6e 64 65 78 21 3d 30 29 0a 20 20 20  e.pIndex!=0).   
19340 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
19350 63 68 61 72 20 2a 7a 46 6d 74 3b 0a 20 20 20 20  char *zFmt;.    
19360 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
19370 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
19380 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 63 68 61  Index;.      cha
19390 72 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c  r *zWhere = expl
193a0 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62  ainIndexRange(db
193b0 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e  , pLoop, pItem->
193c0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 61 73 73  pTab);.      ass
193d0 65 72 74 28 20 21 28 66 6c 61 67 73 26 57 48 45  ert( !(flags&WHE
193e0 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 7c  RE_AUTO_INDEX) |
193f0 7c 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 49  | (flags&WHERE_I
19400 44 58 5f 4f 4e 4c 59 29 20 29 3b 0a 20 20 20 20  DX_ONLY) );.    
19410 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
19420 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 26 26 20  pItem->pTab) && 
19430 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
19440 78 28 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20  x(pIdx) ){.     
19450 20 20 20 7a 46 6d 74 20 3d 20 7a 57 68 65 72 65     zFmt = zWhere
19460 20 3f 20 22 25 73 20 55 53 49 4e 47 20 50 52 49   ? "%s USING PRI
19470 4d 41 52 59 20 4b 45 59 25 2e 30 73 25 73 22 20  MARY KEY%.0s%s" 
19480 3a 20 22 25 73 25 2e 30 73 25 73 22 3b 0a 20 20  : "%s%.0s%s";.  
19490 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c      }else if( fl
194a0 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
194b0 5f 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 20 20  _INDEX ){.      
194c0 20 20 7a 46 6d 74 20 3d 20 22 25 73 20 55 53 49    zFmt = "%s USI
194d0 4e 47 20 41 55 54 4f 4d 41 54 49 43 20 43 4f 56  NG AUTOMATIC COV
194e0 45 52 49 4e 47 20 49 4e 44 45 58 25 2e 30 73 25  ERING INDEX%.0s%
194f0 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  s";.      }else 
19500 69 66 28 20 66 6c 61 67 73 20 26 20 57 48 45 52  if( flags & WHER
19510 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20  E_IDX_ONLY ){.  
19520 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 25 73        zFmt = "%s
19530 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
19540 49 4e 44 45 58 20 25 73 25 73 22 3b 0a 20 20 20  INDEX %s%s";.   
19550 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19560 20 20 7a 46 6d 74 20 3d 20 22 25 73 20 55 53 49    zFmt = "%s USI
19570 4e 47 20 49 4e 44 45 58 20 25 73 25 73 22 3b 0a  NG INDEX %s%s";.
19580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4d        }.      zM
19590 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
195a0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 7a  endf(db, zMsg, z
195b0 46 6d 74 2c 20 7a 4d 73 67 2c 20 70 49 64 78 2d  Fmt, zMsg, pIdx-
195c0 3e 7a 4e 61 6d 65 2c 20 7a 57 68 65 72 65 29 3b  >zName, zWhere);
195d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
195e0 46 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65 29  Free(db, zWhere)
195f0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
19600 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  (flags & WHERE_I
19610 50 4b 29 21 3d 30 20 26 26 20 28 66 6c 61 67 73  PK)!=0 && (flags
19620 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41   & WHERE_CONSTRA
19630 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  INT)!=0 ){.     
19640 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
19650 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
19660 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45  , "%s USING INTE
19670 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
19680 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20  , zMsg);..      
19690 69 66 28 20 66 6c 61 67 73 26 28 57 48 45 52 45  if( flags&(WHERE
196a0 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
196b0 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20  _COLUMN_IN) ){. 
196c0 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
196d0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
196e0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
196f0 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id=?)", zMsg);. 
19700 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
19710 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54 48  flags&WHERE_BOTH
19720 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42  _LIMIT)==WHERE_B
19730 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  OTH_LIMIT ){.   
19740 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
19750 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
19760 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
19770 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22  >? AND rowid<?)"
19780 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
19790 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26 57  else if( flags&W
197a0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
197b0 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
197c0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
197d0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
197e0 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29  rowid>?)", zMsg)
197f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
19800 28 20 41 4c 57 41 59 53 28 66 6c 61 67 73 26 57  ( ALWAYS(flags&W
19810 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 20  HERE_TOP_LIMIT) 
19820 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
19830 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
19840 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
19850 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67  (rowid<?)", zMsg
19860 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
19870 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19880 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
19890 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 28  E.    else if( (
198a0 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  flags & WHERE_VI
198b0 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
198c0 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
198d0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
198e0 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49 52  b, zMsg, "%s VIR
198f0 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58  TUAL TABLE INDEX
19900 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20   %d:%s", zMsg,. 
19910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19920 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
19930 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e  dxNum, pLoop->u.
19940 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20  vtab.idxStr);.  
19950 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7a    }.#endif.    z
19960 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
19970 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
19980 22 25 73 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  "%s", zMsg);.   
19990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
199a0 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
199b0 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69  , iId, iLevel, i
199c0 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  From, zMsg, P4_D
199d0 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  YNAMIC);.  }.}.#
199e0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78  else.# define ex
199f0 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76  plainOneScan(u,v
19a00 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  ,w,x,y,z).#endif
19a10 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
19a20 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a  EXPLAIN */.../*.
19a30 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
19a40 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
19a50 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20  f the iLevel-th 
19a60 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52  loop in the WHER
19a70 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c  E clause.** impl
19a80 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72  ementation descr
19a90 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a  ibed by pWInfo..
19aa0 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
19ab0 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  k codeOneLoopSta
19ac0 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  rt(.  WhereInfo 
19ad0 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f  *pWInfo,   /* Co
19ae0 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69  mplete informati
19af0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48 45  on about the WHE
19b00 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
19b10 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
19b20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76      /* Which lev
19b30 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b  el of pWInfo->a[
19b40 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65  ] should be code
19b50 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  d */.  Bitmask n
19b60 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57  otReady     /* W
19b70 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20  hich tables are 
19b80 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
19b90 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
19ba0 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
19bb0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
19bc0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  s */.  int iCur;
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19be0 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
19bf0 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
19c00 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20    int addrNxt;  
19c10 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
19c20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69  to jump to conti
19c30 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
19c40 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69  t IN case */.  i
19c50 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20  nt omitTable;   
19c60 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
19c70 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20  e use the index 
19c80 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  only */.  int bR
19c90 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev;            /
19ca0 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65  * True if we nee
19cb0 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76  d to scan in rev
19cc0 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20  erse order */.  
19cd0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
19ce0 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72  el;  /* The wher
19cf0 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f  e level to be co
19d00 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ded */.  WhereLo
19d10 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a  op *pLoop;    /*
19d20 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   The WhereLoop o
19d30 62 6a 65 63 74 20 62 65 69 6e 67 20 63 6f 64 65  bject being code
19d40 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  d */.  WhereClau
19d50 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44  se *pWC;    /* D
19d60 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ecomposition of 
19d70 74 68 65 20 65 6e 74 69 72 65 20 57 48 45 52 45  the entire WHERE
19d80 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
19d90 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
19da0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19db0 41 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  A WHERE clause t
19dc0 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  erm */.  Parse *
19dd0 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
19de0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
19df0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
19e00 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
19e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
19e30 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  nection */.  Vdb
19e40 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
19e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19e60 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 6d  The prepared stm
19e70 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
19e80 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63  tions */.  struc
19e90 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
19ea0 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52  pTabItem;  /* FR
19eb0 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62  OM clause term b
19ec0 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
19ed0 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20  int addrBrk;    
19ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ef0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
19f00 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
19f10 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
19f20 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20  ddrCont;        
19f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
19f40 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
19f50 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 63 79  nue with next cy
19f60 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f  cle */.  int iRo
19f70 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20  widReg = 0;     
19f80 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73     /* Rowid is s
19f90 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72 65  tored in this re
19fa0 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a  gister, if not z
19fb0 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ero */.  int iRe
19fc0 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20  leaseReg = 0;   
19fd0 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73     /* Temp regis
19fe0 74 65 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f  ter to free befo
19ff0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a  re returning */.
1a000 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e  .  pParse = pWIn
1a010 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20  fo->pParse;.  v 
1a020 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1a030 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f  .  pWC = &pWInfo
1a040 2d 3e 73 57 43 3b 0a 20 20 64 62 20 3d 20 70 50  ->sWC;.  db = pP
1a050 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4c 65 76  arse->db;.  pLev
1a060 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
1a070 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70  iLevel];.  pLoop
1a080 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
1a090 70 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  p;.  pTabItem = 
1a0a0 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
1a0b0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
1a0c0 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54  om];.  iCur = pT
1a0d0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
1a0e0 0a 20 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65  .  pLevel->notRe
1a0f0 61 64 79 20 3d 20 6e 6f 74 52 65 61 64 79 20 26  ady = notReady &
1a100 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66   ~getMask(&pWInf
1a110 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75  o->sMaskSet, iCu
1a120 72 29 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 57  r);.  bRev = (pW
1a130 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69  Info->revMask>>i
1a140 4c 65 76 65 6c 29 26 31 3b 0a 20 20 6f 6d 69 74  Level)&1;.  omit
1a150 54 61 62 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e  Table = (pLoop->
1a160 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1a170 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20  IDX_ONLY)!=0 .  
1a180 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
1a190 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
1a1a0 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41  & WHERE_FORCE_TA
1a1b0 42 4c 45 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4d  BLE)==0;.  VdbeM
1a1c0 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
1a1d0 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d 6c 6f   "Begin WHERE-lo
1a1e0 6f 70 25 64 3a 20 25 73 22 2c 69 4c 65 76 65 6c  op%d: %s",iLevel
1a1f0 2c 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d  ,pTabItem->pTab-
1a200 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20  >zName));..  /* 
1a210 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f  Create labels fo
1a220 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e  r the "break" an
1a230 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73  d "continue" ins
1a240 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66  tructions.  ** f
1a250 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  or the current l
1a260 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64  oop.  Jump to ad
1a270 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f  drBrk to break o
1a280 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20  ut of a loop..  
1a290 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20  ** Jump to cont 
1a2a0 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c  to go immediatel
1a2b0 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74  y to the next it
1a2c0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  eration of the. 
1a2d0 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20   ** loop..  **. 
1a2e0 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69   ** When there i
1a2f0 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  s an IN operator
1a300 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61  , we also have a
1a310 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c   "addrNxt" label
1a320 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73   that.  ** means
1a330 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
1a340 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61  h the next IN va
1a350 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e  lue combination.
1a360 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72    When.  ** ther
1a370 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72  e are no IN oper
1a380 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e  ators in the con
1a390 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61  straints, the "a
1a3a0 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20  ddrNxt" label.  
1a3b0 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ** is the same a
1a3c0 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a  s "addrBrk"..  *
1a3d0 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c  /.  addrBrk = pL
1a3e0 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20  evel->addrBrk = 
1a3f0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20  pLevel->addrNxt 
1a400 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1a410 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64  eLabel(v);.  add
1a420 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  rCont = pLevel->
1a430 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74  addrCont = sqlit
1a440 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1a450 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  v);..  /* If thi
1a460 73 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  s is the right t
1a470 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f  able of a LEFT O
1a480 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63  UTER JOIN, alloc
1a490 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69  ate and.  ** ini
1a4a0 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79  tialize a memory
1a4b0 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72   cell that recor
1a4c0 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ds if this table
1a4d0 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a   matches any.  *
1a4e0 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66  * row of the lef
1a4f0 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
1a500 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  oin..  */.  if( 
1a510 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20  pLevel->iFrom>0 
1a520 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e  && (pTabItem[0].
1a530 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
1a540 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c  FT)!=0 ){.    pL
1a550 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
1a560 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1a570 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a580 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1a590 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c  teger, 0, pLevel
1a5a0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
1a5b0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1a5c0 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49  , "init LEFT JOI
1a5d0 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22  N no-match flag"
1a5e0 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  ));.  }..  /* Sp
1a5f0 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
1a600 46 52 4f 4d 20 63 6c 61 75 73 65 20 73 75 62 71  FROM clause subq
1a610 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64  uery implemented
1a620 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   as a co-routine
1a630 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 49 74   */.  if( pTabIt
1a640 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
1a650 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59   ){.    int regY
1a660 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d  ield = pTabItem-
1a670 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
1a680 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a690 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
1a6a0 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
1a6b0 20 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64   0, pTabItem->ad
1a6c0 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
1a6d0 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71  pLevel->p2 =  sq
1a6e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a6f0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a700 59 69 65 6c 64 2c 20 61 64 64 72 42 72 6b 29 3b  Yield, addrBrk);
1a710 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1a720 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
1a730 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20  mment((v, "next 
1a740 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22 2c 20  row of \"%s\"", 
1a750 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
1a760 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 70 4c 65  zName));.    pLe
1a770 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74  vel->op = OP_Got
1a780 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  o;.  }else..#ifn
1a790 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a7a0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
1a7b0 66 28 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  f(  (pLoop->wsFl
1a7c0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
1a7d0 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
1a7e0 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
1a7f0 54 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76  The table is a v
1a800 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55  irtual-table.  U
1a810 73 65 20 74 68 65 20 56 46 69 6c 74 65 72 20 61  se the VFilter a
1a820 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20  nd VNext.    ** 
1a830 20 20 20 20 20 20 20 20 20 74 6f 20 61 63 63 65           to acce
1a840 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20  ss the data..   
1a850 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67   */.    int iReg
1a860 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20  ;   /* P3 Value 
1a870 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a  for OP_VFilter *
1a880 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 6f  /.    int addrNo
1a890 74 46 6f 75 6e 64 3b 0a 20 20 20 20 69 6e 74 20  tFound;.    int 
1a8a0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 4c  nConstraint = pL
1a8b0 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 0a 0a 20 20  oop->nLTerm;..  
1a8c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1a8d0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1a8e0 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
1a8f0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
1a900 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  Parse, nConstrai
1a910 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 4e  nt+2);.    addrN
1a920 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c  otFound = pLevel
1a930 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20 20 20 66  ->addrBrk;.    f
1a940 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74  or(j=0; j<nConst
1a950 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  raint; j++){.   
1a960 20 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 3d     int iTarget =
1a970 20 69 52 65 67 2b 6a 2b 32 3b 0a 20 20 20 20 20   iReg+j+2;.     
1a980 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
1a990 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20  aLTerm[j];.     
1a9a0 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
1a9b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1a9c0 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
1a9d0 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a  ator & WO_IN ){.
1a9e0 20 20 20 20 20 20 20 20 63 6f 64 65 45 71 75 61          codeEqua
1a9f0 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
1aa00 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20   pTerm, pLevel, 
1aa10 6a 2c 20 62 52 65 76 2c 20 69 54 61 72 67 65 74  j, bRev, iTarget
1aa20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 4e  );.        addrN
1aa30 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c  otFound = pLevel
1aa40 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 20  ->addrNxt;.     
1aa50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1aa60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1aa70 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
1aa80 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54  Expr->pRight, iT
1aa90 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
1aaa0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1aab0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1aac0 50 5f 49 6e 74 65 67 65 72 2c 20 70 4c 6f 6f 70  P_Integer, pLoop
1aad0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c  ->u.vtab.idxNum,
1aae0 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69   iReg);.    sqli
1aaf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ab00 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 43 6f   OP_Integer, nCo
1ab10 6e 73 74 72 61 69 6e 74 2c 20 69 52 65 67 2b 31  nstraint, iReg+1
1ab20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1ab30 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
1ab40 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64  Filter, iCur, ad
1ab50 64 72 4e 6f 74 46 6f 75 6e 64 2c 20 69 52 65 67  drNotFound, iReg
1ab60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ab70 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75          pLoop->u
1ab80 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 0a 20 20  .vtab.idxStr,.  
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aba0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61      pLoop->u.vta
1abb0 62 2e 6e 65 65 64 46 72 65 65 20 3f 20 50 34 5f  b.needFree ? P4_
1abc0 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41  MPRINTF : P4_STA
1abd0 54 49 43 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  TIC);.    VdbeCo
1abe0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 70  verage(v);.    p
1abf0 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  Loop->u.vtab.nee
1ac00 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 66  dFree = 0;.    f
1ac10 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74  or(j=0; j<nConst
1ac20 72 61 69 6e 74 20 26 26 20 6a 3c 31 36 3b 20 6a  raint && j<16; j
1ac30 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
1ac40 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  pLoop->u.vtab.om
1ac50 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20 29 7b 0a  itMask>>j)&1 ){.
1ac60 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
1ac70 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4c 6f 6f  erm(pLevel, pLoo
1ac80 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29 3b 0a 20  p->aLTerm[j]);. 
1ac90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1aca0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1acb0 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76  _VNext;.    pLev
1acc0 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
1acd0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
1ace0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1acf0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
1ad00 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1ad10 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  pRange(pParse, i
1ad20 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  Reg, nConstraint
1ad30 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +2);.    sqlite3
1ad40 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1ad50 72 73 65 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  rse);.  }else.#e
1ad60 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1ad70 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1ad80 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4c 6f 6f   */..  if( (pLoo
1ad90 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1ada0 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 26 26  RE_IPK)!=0.   &&
1adb0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1adc0 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
1add0 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  _IN|WHERE_COLUMN
1ade0 5f 45 51 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20  _EQ))!=0.  ){.  
1adf0 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65    /* Case 2:  We
1ae00 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65   can directly re
1ae10 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65  ference a single
1ae20 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20   row using an.  
1ae30 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71    **          eq
1ae40 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
1ae50 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
1ae60 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20  WID field.  Or. 
1ae70 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77     **          w
1ae80 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74  e reference mult
1ae90 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20  iple rows using 
1aea0 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e  a "rowid IN (...
1aeb0 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  )".    **       
1aec0 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20     construct..  
1aed0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1aee0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1aef0 6e 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54  nEq==1 );.    pT
1af00 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
1af10 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65  erm[0];.    asse
1af20 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
1af30 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
1af40 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  m->pExpr!=0 );. 
1af50 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
1af60 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74  able==0 );.    t
1af70 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1af80 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1af90 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 69 52  IRTUAL );.    iR
1afa0 65 6c 65 61 73 65 52 65 67 20 3d 20 2b 2b 70 50  eleaseReg = ++pP
1afb0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1afc0 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65  iRowidReg = code
1afd0 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
1afe0 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
1aff0 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20 69 52 65  el, 0, bRev, iRe
1b000 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 69  leaseReg);.    i
1b010 66 28 20 69 52 6f 77 69 64 52 65 67 21 3d 69 52  f( iRowidReg!=iR
1b020 65 6c 65 61 73 65 52 65 67 20 29 20 73 71 6c 69  eleaseReg ) sqli
1b030 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1b040 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61  g(pParse, iRelea
1b050 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72  seReg);.    addr
1b060 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Nxt = pLevel->ad
1b070 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  drNxt;.    sqlit
1b080 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b090 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52  OP_MustBeInt, iR
1b0a0 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74  owidReg, addrNxt
1b0b0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1b0c0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1b0d0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1b0e0 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c  NotExists, iCur,
1b0f0 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64   addrNxt, iRowid
1b100 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Reg);.    VdbeCo
1b110 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1b120 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
1b130 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
1b140 61 72 73 65 2c 20 69 52 6f 77 69 64 52 65 67 2c  arse, iRowidReg,
1b150 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
1b160 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
1b170 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
1b180 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1b190 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1b1a0 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65   "pk"));.    pLe
1b1b0 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
1b1c0 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  p;.  }else if( (
1b1d0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1b1e0 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20   WHERE_IPK)!=0. 
1b1f0 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f          && (pLoo
1b200 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1b210 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29  RE_COLUMN_RANGE)
1b220 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
1b230 43 61 73 65 20 33 3a 20 20 57 65 20 68 61 76 65  Case 3:  We have
1b240 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63   an inequality c
1b250 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
1b260 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
1b270 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
1b280 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f  t testOp = OP_No
1b290 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  op;.    int star
1b2a0 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e  t;.    int memEn
1b2b0 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20  dValue = 0;.    
1b2c0 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72  WhereTerm *pStar
1b2d0 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61  t, *pEnd;..    a
1b2e0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
1b2f0 3d 3d 30 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30  ==0 );.    j = 0
1b300 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70  ;.    pStart = p
1b310 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  End = 0;.    if(
1b320 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1b330 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
1b340 54 20 29 20 70 53 74 61 72 74 20 3d 20 70 4c 6f  T ) pStart = pLo
1b350 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
1b360 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1b370 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1b380 54 4f 50 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64  TOP_LIMIT ) pEnd
1b390 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1b3a0 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72  [j++];.    asser
1b3b0 74 28 20 70 53 74 61 72 74 21 3d 30 20 7c 7c 20  t( pStart!=0 || 
1b3c0 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 69  pEnd!=0 );.    i
1b3d0 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
1b3e0 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b   pTerm = pStart;
1b3f0 0a 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20  .      pStart = 
1b400 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64  pEnd;.      pEnd
1b410 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   = pTerm;.    }.
1b420 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
1b430 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
1b440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b450 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
1b460 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
1b470 20 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a   start bound */.
1b480 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54        int r1, rT
1b490 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  emp;        /* R
1b4a0 65 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c  egisters for hol
1b4b0 64 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 62  ding the start b
1b4c0 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20  oundary */..    
1b4d0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1b4e0 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73  ng constant maps
1b4f0 20 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74   TK_xx codes int
1b500 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  o corresponding 
1b510 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f  .      ** seek o
1b520 70 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65  pcodes.  It depe
1b530 6e 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75  nds on a particu
1b540 6c 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20  lar ordering of 
1b550 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20  TK_xx.      */. 
1b560 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d       const u8 aM
1b570 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  oveOp[] = {.    
1b580 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20         /* TK_GT 
1b590 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 54 2c 0a 20  */  OP_SeekGT,. 
1b5a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
1b5b0 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 45  LE */  OP_SeekLE
1b5c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
1b5d0 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_LT */  OP_See
1b5e0 6b 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  kLT,.           
1b5f0 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f  /* TK_GE */  OP_
1b600 53 65 65 6b 47 45 0a 20 20 20 20 20 20 7d 3b 0a  SeekGE.      };.
1b610 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1b620 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20  _LE==TK_GT+1 ); 
1b630 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
1b640 65 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e  e the ordering..
1b650 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1b660 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32  ( TK_LT==TK_GT+2
1b670 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e   );      /*  ...
1b680 20 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61   of the TK_xx va
1b690 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20  lues... */.     
1b6a0 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
1b6b0 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20  TK_GT+3 );      
1b6c0 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65  /*  ... is corre
1b6d0 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 61  cct. */..      a
1b6e0 73 73 65 72 74 28 20 28 70 53 74 61 72 74 2d 3e  ssert( (pStart->
1b6f0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1b700 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NULL)==0 );.    
1b710 20 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61    testcase( pSta
1b720 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
1b730 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1b740 20 20 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d      pX = pStart-
1b750 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
1b760 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
1b770 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1b780 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f  Start->leftCurso
1b790 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 74 72  r!=iCur ); /* tr
1b7a0 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61  ansitive constra
1b7b0 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 72 31  ints */.      r1
1b7c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1b7d0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1b7e0 58 2d 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d  X->pRight, &rTem
1b7f0 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
1b800 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61  3VdbeAddOp3(v, a
1b810 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b  MoveOp[pX->op-TK
1b820 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72  _GT], iCur, addr
1b830 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Brk, r1);.      
1b840 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1b850 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 56 64  "pk"));.      Vd
1b860 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1b870 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a  pX->op==TK_GT);.
1b880 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b890 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d  geIf(v, pX->op==
1b8a0 54 4b 5f 4c 45 29 3b 0a 20 20 20 20 20 20 56 64  TK_LE);.      Vd
1b8b0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1b8c0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a  pX->op==TK_LT);.
1b8d0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b8e0 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d  geIf(v, pX->op==
1b8f0 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 73 71  TK_GE);.      sq
1b900 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
1b910 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
1b920 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  rse, r1, 1);.   
1b930 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1b940 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1b950 20 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64   rTemp);.      d
1b960 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1b970 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20  l, pStart);.    
1b980 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1b990 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b9a0 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
1b9b0 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43   : OP_Rewind, iC
1b9c0 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  ur, addrBrk);.  
1b9d0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1b9e0 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a  If(v, bRev==0);.
1b9f0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1ba00 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29  geIf(v, bRev!=0)
1ba10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ba20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78  pEnd ){.      Ex
1ba30 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58  pr *pX;.      pX
1ba40 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a   = pEnd->pExpr;.
1ba50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
1ba60 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1ba70 65 72 74 28 20 28 70 45 6e 64 2d 3e 77 74 46 6c  ert( (pEnd->wtFl
1ba80 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
1ba90 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  )==0 );.      te
1baa0 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 6c 65  stcase( pEnd->le
1bab0 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29  ftCursor!=iCur )
1bac0 3b 20 2f 2a 20 54 72 61 6e 73 69 74 69 76 65 20  ; /* Transitive 
1bad0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
1bae0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1baf0 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1bb00 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
1bb10 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65       memEndValue
1bb20 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1bb30 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1bb40 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1bb50 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d   pX->pRight, mem
1bb60 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  EndValue);.     
1bb70 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
1bb80 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LT || pX->op==TK
1bb90 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74  _GT ){.        t
1bba0 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
1bbb0 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20  P_Le : OP_Ge;.  
1bbc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bbd0 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
1bbe0 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74   ? OP_Lt : OP_Gt
1bbf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bc00 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1bc10 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d  el, pEnd);.    }
1bc20 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c  .    start = sql
1bc30 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1bc40 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76  ddr(v);.    pLev
1bc50 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20  el->op = bRev ? 
1bc60 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
1bc70 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  t;.    pLevel->p
1bc80 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
1bc90 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
1bca0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
1bcb0 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
1bcc0 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
1bcd0 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
1bce0 69 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b 70 50  iRowidReg = ++pP
1bcf0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1bd00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bd10 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
1bd20 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67   iCur, iRowidReg
1bd30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1bd40 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
1bd50 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
1bd60 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1bd70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bd80 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20  dOp3(v, testOp, 
1bd90 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64  memEndValue, add
1bda0 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29  rBrk, iRowidReg)
1bdb0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1bdc0 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70  rageIf(v, testOp
1bdd0 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
1bde0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1bdf0 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 74 29  , testOp==OP_Lt)
1be00 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1be10 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70  rageIf(v, testOp
1be20 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
1be30 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1be40 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 74 29  , testOp==OP_Gt)
1be50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1be60 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
1be70 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
1be80 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  C | SQLITE_JUMPI
1be90 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  FNULL);.    }.  
1bea0 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d  }else if( pLoop-
1beb0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1bec0 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
1bed0 2f 2a 20 43 61 73 65 20 34 3a 20 41 20 73 63 61  /* Case 4: A sca
1bee0 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  n using an index
1bef0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1bf00 20 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52          The WHER
1bf10 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e  E clause may con
1bf20 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  tain zero or mor
1bf30 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20  e equality .    
1bf40 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73  **         terms
1bf50 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f   ("==" or "IN" o
1bf60 70 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72  perators) that r
1bf70 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20  efer to the N.  
1bf80 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66    **         lef
1bf90 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f  t-most columns o
1bfa0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20  f the index. It 
1bfb0 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
1bfc0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1bfd0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1bfe0 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d  raints (>, <, >=
1bff0 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69   or <=) on the i
1c000 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20  ndexed.    **   
1c010 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61        column tha
1c020 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  t immediately fo
1c030 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61  llows the N equa
1c040 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20  lities. Only .  
1c050 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
1c060 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
1c070 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
1c080 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
1c090 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20  st must.    **  
1c0a0 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22         use the "
1c0b0 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65  ==" and "IN" ope
1c0c0 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d  rators. For exam
1c0d0 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20  ple, if the .   
1c0e0 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65   **         inde
1c0f0 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c  x is on (x,y,z),
1c100 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   then the follow
1c110 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20  ing clauses are 
1c120 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  all .    **     
1c130 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20      optimized:. 
1c140 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1c150 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20          x=5.    
1c160 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
1c170 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a  5 AND y=10.    *
1c180 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1c190 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
1c1a0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1c1b0 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30  AND y>5 AND y<10
1c1c0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1c1d0 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41     x=5 AND y=5 A
1c1e0 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a  ND z<=10.    **.
1c1f0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
1c200 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20  he z<10 term of 
1c210 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  the following ca
1c220 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e  nnot be used, on
1c230 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ly.    **       
1c240 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a    the x=5 term:.
1c250 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1c260 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
1c270 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20   z<10.    **.   
1c280 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61   **         N ma
1c290 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65  y be zero if the
1c2a0 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74  re are inequalit
1c2b0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20  y constraints.. 
1c2c0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66     **         If
1c2d0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e   there are no in
1c2e0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1c2f0 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20  ints, then N is 
1c300 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  at.    **       
1c310 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20    least one..   
1c320 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1c330 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20     This case is 
1c340 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74  also used when t
1c350 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52  here are no WHER
1c360 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  E clause.    ** 
1c370 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69          constrai
1c380 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78  nts but an index
1c390 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79   is selected any
1c3a0 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20  way, in order.  
1c3b0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20    **         to 
1c3c0 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74  force the output
1c3d0 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72   order to confor
1c3e0 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59  m to an ORDER BY
1c3f0 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73  ..    */  .    s
1c400 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
1c410 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20  StartOp[] = {.  
1c420 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a      0,.      0,.
1c430 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c        OP_Rewind,
1c440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a             /* 2:
1c450 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61   (!start_constra
1c460 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20  ints && startEq 
1c470 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20  &&  !bRev) */.  
1c480 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20      OP_Last,    
1c490 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28           /* 3: (
1c4a0 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  !start_constrain
1c4b0 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26  ts && startEq &&
1c4c0 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20     bRev) */.    
1c4d0 20 20 4f 50 5f 53 65 65 6b 47 54 2c 20 20 20 20    OP_SeekGT,    
1c4e0 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74         /* 4: (st
1c4f0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1c500 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20   && !startEq && 
1c510 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1c520 4f 50 5f 53 65 65 6b 4c 54 2c 20 20 20 20 20 20  OP_SeekLT,      
1c530 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72       /* 5: (star
1c540 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1c550 26 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62  & !startEq &&  b
1c560 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1c570 5f 53 65 65 6b 47 45 2c 20 20 20 20 20 20 20 20  _SeekGE,        
1c580 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f     /* 6: (start_
1c590 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
1c5a0 20 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65   startEq && !bRe
1c5b0 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
1c5c0 65 65 6b 4c 45 20 20 20 20 20 20 20 20 20 20 20  eekLE           
1c5d0 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f   /* 7: (start_co
1c5e0 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73  nstraints  &&  s
1c5f0 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29  tartEq &&  bRev)
1c600 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73   */.    };.    s
1c610 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
1c620 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  EndOp[] = {.    
1c630 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20    OP_IdxGE,     
1c640 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 65 6e         /* 0: (en
1c650 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
1c660 20 21 62 52 65 76 20 26 26 20 21 65 6e 64 45 71   !bRev && !endEq
1c670 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
1c680 78 47 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  xGT,            
1c690 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 1: (end_const
1c6a0 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 20  raints && !bRev 
1c6b0 26 26 20 20 65 6e 64 45 71 29 20 2a 2f 0a 20 20  &&  endEq) */.  
1c6c0 20 20 20 20 4f 50 5f 49 64 78 4c 45 2c 20 20 20      OP_IdxLE,   
1c6d0 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28           /* 2: (
1c6e0 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
1c6f0 26 26 20 20 62 52 65 76 20 26 26 20 21 65 6e 64  &&  bRev && !end
1c700 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  Eq) */.      OP_
1c710 49 64 78 4c 54 2c 20 20 20 20 20 20 20 20 20 20  IdxLT,          
1c720 20 20 2f 2a 20 33 3a 20 28 65 6e 64 5f 63 6f 6e    /* 3: (end_con
1c730 73 74 72 61 69 6e 74 73 20 26 26 20 20 62 52 65  straints &&  bRe
1c740 76 20 26 26 20 20 65 6e 64 45 71 29 20 2a 2f 0a  v &&  endEq) */.
1c750 20 20 20 20 7d 3b 0a 20 20 20 20 75 31 36 20 6e      };.    u16 n
1c760 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
1c770 72 65 65 2e 6e 45 71 3b 20 20 20 20 20 2f 2a 20  ree.nEq;     /* 
1c780 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  Number of == or 
1c790 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  IN terms */.    
1c7a0 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
1c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c7c0 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f  Base register ho
1c7d0 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74  lding constraint
1c7e0 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 57   values */.    W
1c7f0 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
1c800 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49  Start = 0;  /* I
1c810 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1c820 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74  aint at range st
1c830 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  art */.    Where
1c840 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20  Term *pRangeEnd 
1c850 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75  = 0;    /* Inequ
1c860 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1c870 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f   at range end */
1c880 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 45 71  .    int startEq
1c890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c8a0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
1c8b0 67 65 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d  ge start uses ==
1c8c0 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20  , >= or <= */.  
1c8d0 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20    int endEq;    
1c8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c8f0 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20  * True if range 
1c900 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20  end uses ==, >= 
1c910 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74  or <= */.    int
1c920 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
1c930 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61  ts;       /* Sta
1c940 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63  rt of range is c
1c950 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20  onstrained */.  
1c960 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
1c970 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
1c980 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73  * Number of cons
1c990 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a  traint terms */.
1c9a0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9c0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65   /* The index we
1c9d0 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a   will be using *
1c9e0 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  /.    int iIdxCu
1c9f0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
1ca00 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
1ca10 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e  ursor for the in
1ca20 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  dex */.    int n
1ca30 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20  ExtraReg = 0;   
1ca40 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ca50 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
1ca60 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20  ters needed */. 
1ca70 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20     int op;      
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca90 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f  /* Instruction o
1caa0 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61  pcode */.    cha
1cab0 72 20 2a 7a 53 74 61 72 74 41 66 66 3b 20 20 20  r *zStartAff;   
1cac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
1cad0 69 6e 69 74 79 20 66 6f 72 20 73 74 61 72 74 20  inity for start 
1cae0 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  of range constra
1caf0 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  int */.    char 
1cb00 63 45 6e 64 41 66 66 20 3d 20 30 3b 20 20 20 20  cEndAff = 0;    
1cb10 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
1cb20 69 74 79 20 66 6f 72 20 65 6e 64 20 6f 66 20 72  ity for end of r
1cb30 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
1cb40 2a 2f 0a 20 20 20 20 75 38 20 62 53 65 65 6b 50  */.    u8 bSeekP
1cb50 61 73 74 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20  astNull = 0;    
1cb60 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
1cb70 65 65 6b 20 70 61 73 74 20 69 6e 69 74 69 61 6c  eek past initial
1cb80 20 6e 75 6c 6c 73 20 2a 2f 0a 20 20 20 20 75 38   nulls */.    u8
1cb90 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20 3d 20 30   bStopAtNull = 0
1cba0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
1cbb0 64 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 74  d condition to t
1cbc0 65 72 6d 69 6e 61 74 65 20 61 74 20 4e 55 4c 4c  erminate at NULL
1cbd0 73 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d  s */..    pIdx =
1cbe0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1cbf0 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 49 64 78  pIndex;.    iIdx
1cc00 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
1cc10 64 78 43 75 72 3b 0a 20 20 20 20 61 73 73 65 72  dxCur;.    asser
1cc20 74 28 20 6e 45 71 3e 3d 70 4c 6f 6f 70 2d 3e 75  t( nEq>=pLoop->u
1cc30 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 29 3b 0a  .btree.nSkip );.
1cc40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1cc50 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61  loop satisfies a
1cc60 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72   sort order (pOr
1cc70 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74  derBy) request t
1cc80 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20  hat .    ** was 
1cc90 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1cca0 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65  unction to imple
1ccb0 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d  ment a "SELECT m
1ccc0 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20  in(x) ..." .    
1ccd0 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74  ** query, then t
1cce0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
1ccf0 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f  nly allow the lo
1cd00 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20  op to run for.  
1cd10 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74    ** a single it
1cd20 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  eration. This me
1cd30 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72  ans that the fir
1cd40 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a  st row returned.
1cd50 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f      ** should no
1cd60 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61  t have a NULL va
1cd70 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78  lue stored in 'x
1cd80 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27  '. If column 'x'
1cd90 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66   is.    ** the f
1cda0 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74  irst one after t
1cdb0 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20  he nEq equality 
1cdc0 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
1cdd0 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a  he index,.    **
1cde0 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73   this requires s
1cdf0 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ome special hand
1ce00 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ling..    */.   
1ce10 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
1ce20 3e 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20 20 20  >pOrderBy==0.   
1ce30 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d        || pWInfo-
1ce40 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
1ce50 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==1.         || 
1ce60 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
1ce70 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
1ce80 59 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20  Y_MIN)==0 );.   
1ce90 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
1cea0 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
1ceb0 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20  RDERBY_MIN)!=0. 
1cec0 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e      && pWInfo->n
1ced0 4f 42 53 61 74 3e 30 0a 20 20 20 20 20 26 26 20  OBSat>0.     && 
1cee0 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e  (pIdx->nKeyCol>n
1cef0 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
1cf00 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
1cf10 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3d 3d 30  u.btree.nSkip==0
1cf20 20 29 3b 0a 20 20 20 20 20 20 62 53 65 65 6b 50   );.      bSeekP
1cf30 61 73 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20  astNull = 1;.   
1cf40 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
1cf50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1cf60 46 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c  Find any inequal
1cf70 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  ity constraint t
1cf80 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61  erms for the sta
1cf90 72 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20  rt and end .    
1cfa0 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  ** of the range.
1cfb0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6a 20 3d   .    */.    j =
1cfc0 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 4c   nEq;.    if( pL
1cfd0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1cfe0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
1cff0 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53 74  {.      pRangeSt
1d000 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  art = pLoop->aLT
1d010 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20  erm[j++];.      
1d020 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
1d030 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
1d040 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1d050 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b  ERE_TOP_LIMIT ){
1d060 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64  .      pRangeEnd
1d070 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1d080 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78  [j++];.      nEx
1d090 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
1d0a0 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72    if( pRangeStar
1d0b0 74 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  t==0.       && (
1d0c0 6a 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  j = pIdx->aiColu
1d0d0 6d 6e 5b 6e 45 71 5d 29 3e 3d 30 20 0a 20 20 20  mn[nEq])>=0 .   
1d0e0 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70 54 61      && pIdx->pTa
1d0f0 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74  ble->aCol[j].not
1d100 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 29 7b  Null==0.      ){
1d110 0a 20 20 20 20 20 20 20 20 62 53 65 65 6b 50 61  .        bSeekPa
1d120 73 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20  stNull = 1;.    
1d130 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1d140 73 65 72 74 28 20 70 52 61 6e 67 65 45 6e 64 3d  sert( pRangeEnd=
1d150 3d 30 20 7c 7c 20 28 70 52 61 6e 67 65 45 6e 64  =0 || (pRangeEnd
1d160 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1d170 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 0a 20  _VNULL)==0 );.. 
1d180 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
1d190 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
1d1a0 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  all constraint t
1d1b0 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72  erms using == or
1d1c0 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73   IN.    ** and s
1d1d0 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73 20  tore the values 
1d1e0 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69  of those terms i
1d1f0 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
1d200 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
1d210 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 42 61  tarting at regBa
1d220 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  se..    */.    r
1d230 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c  egBase = codeAll
1d240 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50  EqualityTerms(pP
1d250 61 72 73 65 2c 70 4c 65 76 65 6c 2c 62 52 65 76  arse,pLevel,bRev
1d260 2c 6e 45 78 74 72 61 52 65 67 2c 26 7a 53 74 61  ,nExtraReg,&zSta
1d270 72 74 41 66 66 29 3b 0a 20 20 20 20 61 73 73 65  rtAff);.    asse
1d280 72 74 28 20 7a 53 74 61 72 74 41 66 66 3d 3d 30  rt( zStartAff==0
1d290 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 6c 65   || sqlite3Strle
1d2a0 6e 33 30 28 7a 53 74 61 72 74 41 66 66 29 3e 3d  n30(zStartAff)>=
1d2b0 6e 45 71 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  nEq );.    if( z
1d2c0 53 74 61 72 74 41 66 66 20 29 20 63 45 6e 64 41  StartAff ) cEndA
1d2d0 66 66 20 3d 20 7a 53 74 61 72 74 41 66 66 5b 6e  ff = zStartAff[n
1d2e0 45 71 5d 3b 0a 20 20 20 20 61 64 64 72 4e 78 74  Eq];.    addrNxt
1d2f0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
1d300 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  xt;..    /* If w
1d310 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65  e are doing a re
1d320 76 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e  verse order scan
1d330 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67   on an ascending
1d340 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a   index, or.    *
1d350 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65  * a forward orde
1d360 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63  r scan on a desc
1d370 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e  ending index, in
1d380 74 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20  terchange the . 
1d390 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20     ** start and 
1d3a0 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67  end terms (pRang
1d3b0 65 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67  eStart and pRang
1d3c0 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  eEnd)..    */.  
1d3d0 20 20 69 66 28 20 28 6e 45 71 3c 70 49 64 78 2d    if( (nEq<pIdx-
1d3e0 3e 6e 4b 65 79 43 6f 6c 20 26 26 20 62 52 65 76  >nKeyCol && bRev
1d3f0 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  ==(pIdx->aSortOr
1d400 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45  der[nEq]==SQLITE
1d410 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20 20 20 7c  _SO_ASC)).     |
1d420 7c 20 28 62 52 65 76 20 26 26 20 70 49 64 78 2d  | (bRev && pIdx-
1d430 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 45 71 29 0a 20  >nKeyCol==nEq). 
1d440 20 20 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50     ){.      SWAP
1d450 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52  (WhereTerm *, pR
1d460 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53  angeEnd, pRangeS
1d470 74 61 72 74 29 3b 0a 20 20 20 20 20 20 53 57 41  tart);.      SWA
1d480 50 28 75 38 2c 20 62 53 65 65 6b 50 61 73 74 4e  P(u8, bSeekPastN
1d490 75 6c 6c 2c 20 62 53 74 6f 70 41 74 4e 75 6c 6c  ull, bStopAtNull
1d4a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65  );.    }..    te
1d4b0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
1d4c0 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74  art && (pRangeSt
1d4d0 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
1d4e0 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20   WO_LE)!=0 );.  
1d4f0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1d500 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e  geStart && (pRan
1d510 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
1d520 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29  or & WO_GE)!=0 )
1d530 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d540 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52  pRangeEnd && (pR
1d550 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
1d560 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29  or & WO_LE)!=0 )
1d570 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d580 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52  pRangeEnd && (pR
1d590 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
1d5a0 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29  or & WO_GE)!=0 )
1d5b0 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d 20  ;.    startEq = 
1d5c0 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20  !pRangeStart || 
1d5d0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
1d5e0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
1d5f0 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45  WO_GE);.    endE
1d600 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64  q =   !pRangeEnd
1d610 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   || pRangeEnd->e
1d620 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
1d630 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74  E|WO_GE);.    st
1d640 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1d650 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c  = pRangeStart ||
1d660 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20   nEq>0;..    /* 
1d670 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63  Seek the index c
1d680 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61  ursor to the sta
1d690 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  rt of the range.
1d6a0 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61   */.    nConstra
1d6b0 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69  int = nEq;.    i
1d6c0 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 29  f( pRangeStart )
1d6d0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
1d6e0 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61  ight = pRangeSta
1d6f0 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rt->pExpr->pRigh
1d700 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
1d710 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1d720 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
1d730 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28  +nEq);.      if(
1d740 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77   (pRangeStart->w
1d750 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
1d760 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  ULL)==0.       &
1d770 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  & sqlite3ExprCan
1d780 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 0a 20  BeNull(pRight). 
1d790 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1d7a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d7b0 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
1d7c0 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64  regBase+nEq, add
1d7d0 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 20 20 56  rNxt);.        V
1d7e0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1d7f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1d800 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20  ( zStartAff ){. 
1d810 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1d820 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
1d830 79 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74  y(pRight, zStart
1d840 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54  Aff[nEq])==SQLIT
1d850 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20  E_AFF_NONE){.   
1d860 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20         /* Since 
1d870 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
1d880 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65  s to be performe
1d890 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72  d with no conver
1d8a0 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20  sions.          
1d8b0 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68  ** applied to th
1d8c0 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20  e operands, set 
1d8d0 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
1d8e0 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20  apply to pRight 
1d8f0 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  to .          **
1d900 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1d910 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
1d920 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d  zStartAff[nEq] =
1d930 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1d940 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d950 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1d960 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
1d970 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
1d980 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29   zStartAff[nEq])
1d990 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53   ){.          zS
1d9a0 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53  tartAff[nEq] = S
1d9b0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
1d9c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d9d0 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  }  .      nConst
1d9e0 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74  raint++;.      t
1d9f0 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
1da00 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
1da10 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
1da20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 53      }else if( bS
1da30 65 65 6b 50 61 73 74 4e 75 6c 6c 20 29 7b 0a 20  eekPastNull ){. 
1da40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1da50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1da60 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45  l, 0, regBase+nE
1da70 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  q);.      nConst
1da80 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  raint++;.      s
1da90 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20  tartEq = 0;.    
1daa0 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69    start_constrai
1dab0 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nts = 1;.    }. 
1dac0 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
1dad0 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
1dae0 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
1daf0 74 20 2d 20 62 53 65 65 6b 50 61 73 74 4e 75 6c  t - bSeekPastNul
1db00 6c 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  l, zStartAff);. 
1db10 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70     op = aStartOp
1db20 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  [(start_constrai
1db30 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74  nts<<2) + (start
1db40 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a  Eq<<1) + bRev];.
1db50 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d      assert( op!=
1db60 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
1db70 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
1db80 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64   op, iIdxCur, ad
1db90 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20  drNxt, regBase, 
1dba0 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
1dbb0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1dbc0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1dbd0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
1dbe0 52 65 77 69 6e 64 29 3b 20 20 74 65 73 74 63 61  Rewind);  testca
1dbf0 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e  se( op==OP_Rewin
1dc00 64 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  d );.    VdbeCov
1dc10 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
1dc20 50 5f 4c 61 73 74 29 3b 20 20 20 20 74 65 73 74  P_Last);    test
1dc30 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73  case( op==OP_Las
1dc40 74 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  t );.    VdbeCov
1dc50 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
1dc60 50 5f 53 65 65 6b 47 54 29 3b 20 20 74 65 73 74  P_SeekGT);  test
1dc70 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
1dc80 6b 47 54 20 29 3b 0a 20 20 20 20 56 64 62 65 43  kGT );.    VdbeC
1dc90 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1dca0 3d 4f 50 5f 53 65 65 6b 47 45 29 3b 20 20 74 65  =OP_SeekGE);  te
1dcb0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
1dcc0 65 65 6b 47 45 20 29 3b 0a 20 20 20 20 56 64 62  eekGE );.    Vdb
1dcd0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1dce0 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 29 3b 20 20  p==OP_SeekLE);  
1dcf0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1dd00 5f 53 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 56  _SeekLE );.    V
1dd10 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1dd20 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29 3b   op==OP_SeekLT);
1dd30 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1dd40 4f 50 5f 53 65 65 6b 4c 54 20 29 3b 0a 0a 20 20  OP_SeekLT );..  
1dd50 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61    /* Load the va
1dd60 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71  lue for the ineq
1dd70 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1dd80 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  t at the end of 
1dd90 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65  the.    ** range
1dda0 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a   (if any)..    *
1ddb0 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e  /.    nConstrain
1ddc0 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28  t = nEq;.    if(
1ddd0 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20   pRangeEnd ){.  
1dde0 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
1ddf0 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45   = pRangeEnd->pE
1de00 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
1de10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1de20 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
1de30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31  , regBase+nEq, 1
1de40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1de50 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1de60 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
1de70 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28  +nEq);.      if(
1de80 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46   (pRangeEnd->wtF
1de90 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
1dea0 4c 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  L)==0.       && 
1deb0 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
1dec0 4e 75 6c 6c 28 70 52 69 67 68 74 29 0a 20 20 20  Null(pRight).   
1ded0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
1dee0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1def0 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
1df00 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
1df10 78 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  xt);.        Vdb
1df20 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1df30 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1df40 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1df50 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 63  finity(pRight, c
1df60 45 6e 64 41 66 66 29 21 3d 53 51 4c 49 54 45 5f  EndAff)!=SQLITE_
1df70 41 46 46 5f 4e 4f 4e 45 0a 20 20 20 20 20 20 20  AFF_NONE.       
1df80 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 4e  && !sqlite3ExprN
1df90 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
1dfa0 61 6e 67 65 28 70 52 69 67 68 74 2c 20 63 45 6e  ange(pRight, cEn
1dfb0 64 41 66 66 29 0a 20 20 20 20 20 20 29 7b 0a 20  dAff).      ){. 
1dfc0 20 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79         codeApply
1dfd0 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
1dfe0 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 2c   regBase+nEq, 1,
1dff0 20 26 63 45 6e 64 41 66 66 29 3b 0a 20 20 20 20   &cEndAff);.    
1e000 20 20 7d 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74    }.      nConst
1e010 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74  raint++;.      t
1e020 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
1e030 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
1e040 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1e050 20 20 7d 65 6c 73 65 20 69 66 28 20 62 53 74 6f    }else if( bSto
1e060 70 41 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  pAtNull ){.     
1e070 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e080 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1e090 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
1e0a0 20 20 20 20 20 20 65 6e 64 45 71 20 3d 20 30 3b        endEq = 0;
1e0b0 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
1e0c0 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
1e0d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1e0e0 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 0a 20  , zStartAff);.. 
1e0f0 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
1e100 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20   loop body */.  
1e110 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
1e120 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1e130 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f  tAddr(v);..    /
1e140 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69  * Check if the i
1e150 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73 20 70  ndex cursor is p
1e160 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
1e170 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20  he range. */.   
1e180 20 69 66 28 20 6e 43 6f 6e 73 74 72 61 69 6e 74   if( nConstraint
1e190 20 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20 61   ){.      op = a
1e1a0 45 6e 64 4f 70 5b 62 52 65 76 2a 32 20 2b 20 65  EndOp[bRev*2 + e
1e1b0 6e 64 45 71 5d 3b 0a 20 20 20 20 20 20 73 71 6c  ndEq];.      sql
1e1c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1e1d0 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  t(v, op, iIdxCur
1e1e0 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61  , addrNxt, regBa
1e1f0 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  se, nConstraint)
1e200 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e210 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 54 20 29  ( op==OP_IdxGT )
1e220 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ;  VdbeCoverageI
1e230 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 47  f(v, op==OP_IdxG
1e240 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
1e250 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47  ase( op==OP_IdxG
1e260 45 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  E );  VdbeCovera
1e270 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49  geIf(v, op==OP_I
1e280 64 78 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65  dxGE );.      te
1e290 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49  stcase( op==OP_I
1e2a0 64 78 4c 54 20 29 3b 20 20 56 64 62 65 43 6f 76  dxLT );  VdbeCov
1e2b0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
1e2c0 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 20  P_IdxLT );.     
1e2d0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1e2e0 50 5f 49 64 78 4c 45 20 29 3b 20 20 56 64 62 65  P_IdxLE );  Vdbe
1e2f0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1e300 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b 0a 20 20  ==OP_IdxLE );.  
1e310 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b    }..    /* Seek
1e320 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   the table curso
1e330 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  r, if required *
1e340 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72  /.    disableTer
1e350 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
1e360 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61  Start);.    disa
1e370 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1e380 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20  pRangeEnd);.    
1e390 69 66 28 20 6f 6d 69 74 54 61 62 6c 65 20 29 7b  if( omitTable ){
1e3a0 0a 20 20 20 20 20 20 2f 2a 20 70 49 64 78 20 69  .      /* pIdx i
1e3b0 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
1e3c0 65 78 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  ex.  No need to 
1e3d0 61 63 63 65 73 73 20 74 68 65 20 6d 61 69 6e 20  access the main 
1e3e0 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 7d 65  table. */.    }e
1e3f0 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77 69 64  lse if( HasRowid
1e400 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 20 29  (pIdx->pTable) )
1e410 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
1e420 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
1e430 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
1e440 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e450 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
1e460 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Cur, iRowidReg);
1e470 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1e480 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
1e490 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69  rse, iCur, -1, i
1e4a0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1e4b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e4c0 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69  p2(v, OP_Seek, i
1e4d0 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Cur, iRowidReg);
1e4e0 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65    /* Deferred se
1e4f0 65 6b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20  ek */.    }else 
1e500 69 66 28 20 69 43 75 72 21 3d 69 49 64 78 43 75  if( iCur!=iIdxCu
1e510 72 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  r ){.      Index
1e520 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50   *pPk = sqlite3P
1e530 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
1e540 49 64 78 2d 3e 70 54 61 62 6c 65 29 3b 0a 20 20  Idx->pTable);.  
1e550 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
1e560 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
1e570 6e 67 65 28 70 50 61 72 73 65 2c 20 70 50 6b 2d  nge(pParse, pPk-
1e580 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20  >nKeyCol);.     
1e590 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d   for(j=0; j<pPk-
1e5a0 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
1e5b0 20 20 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69          k = sqli
1e5c0 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
1e5d0 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61 69 43 6f  (pIdx, pPk->aiCo
1e5e0 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  lumn[j]);.      
1e5f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e600 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
1e610 2c 20 69 49 64 78 43 75 72 2c 20 6b 2c 20 69 52  , iIdxCur, k, iR
1e620 6f 77 69 64 52 65 67 2b 6a 29 3b 0a 20 20 20 20  owidReg+j);.    
1e630 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1e640 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1e650 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69  , OP_NotFound, i
1e660 43 75 72 2c 20 61 64 64 72 43 6f 6e 74 2c 0a 20  Cur, addrCont,. 
1e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e680 20 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64            iRowid
1e690 52 65 67 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Reg, pPk->nKeyCo
1e6a0 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
1e6b0 28 76 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (v);.    }..    
1e6c0 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e  /* Record the in
1e6d0 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74  struction used t
1e6e0 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
1e6f0 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20  loop. Disable . 
1e700 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75     ** WHERE clau
1e710 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65  se terms made re
1e720 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69  dundant by the i
1e730 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e  ndex range scan.
1e740 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e750 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1e760 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b   WHERE_ONEROW ){
1e770 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
1e780 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
1e790 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20   }else if( bRev 
1e7a0 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
1e7b0 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20  >op = OP_Prev;. 
1e7c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e7d0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1e7e0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
1e7f0 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64  pLevel->p1 = iId
1e800 78 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  xCur;.    pLevel
1e810 2d 3e 70 33 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77  ->p3 = (pLoop->w
1e820 73 46 6c 61 67 73 26 57 48 45 52 45 5f 55 4e 51  sFlags&WHERE_UNQ
1e830 5f 57 41 4e 54 45 44 29 21 3d 30 20 3f 20 31 3a  _WANTED)!=0 ? 1:
1e840 30 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  0;.    if( (pLoo
1e850 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1e860 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d  RE_CONSTRAINT)==
1e870 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
1e880 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
1e890 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
1e8a0 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c  AN_STEP;.    }el
1e8b0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1e8c0 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
1e8d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
1e8e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1e8f0 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
1e900 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f  ATION.  if( pLoo
1e910 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1e920 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
1e930 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54     /* Case 5:  T
1e940 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
1e950 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65  ately indexed te
1e960 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
1e970 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   OR.    **.    *
1e980 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
1e990 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
1e9a0 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
1e9b0 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  ,d);.    **   CR
1e9c0 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
1e9d0 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(a);.    **  
1e9e0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
1e9f0 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a   ON t1(b);.    *
1ea00 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
1ea10 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20   i3 ON t1(c);.  
1ea20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
1ea30 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1ea40 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20  HERE a=5 OR b=7 
1ea50 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31  OR (c=11 AND d=1
1ea60 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  3).    **.    **
1ea70 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c   In the example,
1ea80 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
1ea90 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
1eaa0 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a  onnected by OR..
1eab0 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f      ** The top o
1eac0 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73  f the loop looks
1ead0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
1eae0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1eaf0 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1eb10 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
1eb20 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
1eb30 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f  .    ** Then, fo
1eb40 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74  r each indexed t
1eb50 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  erm, the followi
1eb60 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  ng. The argument
1eb70 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53  s to.    ** RowS
1eb80 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20  etTest are such 
1eb90 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f  that the rowid o
1eba0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
1ebb0 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20  w is inserted.  
1ebc0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f    ** into the Ro
1ebd0 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61  wSet. If it is a
1ebe0 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20  lready present, 
1ebf0 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68  control skips th
1ec00 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f  e.    ** Gosub o
1ec10 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20  pcode and jumps 
1ec20 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20  straight to the 
1ec30 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
1ec40 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20  y WhereEnd()..  
1ec50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1ec60 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
1ec70 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20  egin(<term>).   
1ec80 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77   **          Row
1ec90 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20  SetTest         
1eca0 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72           # Inser
1ecb0 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77  t rowid into row
1ecc0 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  set.    **      
1ecd0 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32      Gosub      2
1ece0 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   A.    **       
1ecf0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1ed00 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ().    **.    **
1ed10 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61   Following the a
1ed20 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65  bove, code to te
1ed30 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
1ed40 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74  . Label A, the t
1ed50 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20  arget.    ** of 
1ed60 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c  the Gosub above,
1ed70 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e   jumps to the in
1ed80 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20  struction right 
1ed90 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a  after the Goto..
1eda0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1edb0 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
1edc0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
1edd0 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
1ede0 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
1edf0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
1ee00 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20  to       B      
1ee10 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20            # The 
1ee20 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64  loop is finished
1ee30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1ee40 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62        A: <loop b
1ee50 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20  ody>            
1ee60 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61       # Return da
1ee70 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20  ta, whatever..  
1ee80 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1ee90 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20       Return     
1eea0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
1eeb0 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20   # Jump back to 
1eec0 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a  the Gosub.    **
1eed0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a  .    **       B:
1eee0 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70   <after the loop
1eef0 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  >.    **.    ** 
1ef00 41 64 64 65 64 20 32 30 31 34 2d 30 35 2d 32 36  Added 2014-05-26
1ef10 3a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69  : If the table i
1ef20 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  s a WITHOUT ROWI
1ef30 44 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 20 20  D table, then.  
1ef40 20 20 2a 2a 20 75 73 65 20 61 6e 20 65 70 68 65    ** use an ephe
1ef50 6d 65 72 61 6c 20 69 6e 64 65 78 20 69 6e 73 74  meral index inst
1ef60 65 61 64 20 6f 66 20 61 20 52 6f 77 53 65 74 20  ead of a RowSet 
1ef70 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 70 72  to record the pr
1ef80 69 6d 61 72 79 0a 20 20 20 20 2a 2a 20 6b 65 79  imary.    ** key
1ef90 73 20 6f 66 20 74 68 65 20 72 6f 77 73 20 77 65  s of the rows we
1efa0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65   have already se
1efb0 65 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  en..    **.    *
1efc0 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73  /.    WhereClaus
1efd0 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20  e *pOrWc;    /* 
1efe0 54 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72  The OR-clause br
1eff0 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75  oken out into su
1f000 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72  bterms */.    Sr
1f010 63 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20  cList *pOrTab;  
1f020 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65       /* Shortene
1f030 64 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20  d table list or 
1f040 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61  OR-clause genera
1f050 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65  tion */.    Inde
1f060 78 20 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20  x *pCov = 0;    
1f070 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65           /* Pote
1f080 6e 74 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69  ntial covering i
1f090 6e 64 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  ndex (or NULL) *
1f0a0 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75  /.    int iCovCu
1f0b0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
1f0c0 2b 2b 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75  ++;  /* Cursor u
1f0d0 73 65 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63  sed for index sc
1f0e0 61 6e 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ans (if any) */.
1f0f0 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 74 75  .    int regRetu
1f100 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
1f110 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Mem;           /
1f120 2a 20 52 65 67 69 73 74 65 72 20 75 73 65 64 20  * Register used 
1f130 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f  with OP_Gosub */
1f140 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73  .    int regRows
1f150 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
1f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f170 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 52  * Register for R
1f180 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  owSet object */.
1f190 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
1f1a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f1c0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
1f1d0 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69  g rowid */.    i
1f1e0 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73  nt iLoopBody = s
1f1f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1f200 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72  bel(v);  /* Star
1f210 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a  t of loop body *
1f220 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e  /.    int iRetIn
1f230 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f250 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 65  /* Address of re
1f260 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a  gReturn init */.
1f270 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64      int untested
1f280 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20  Terms = 0;      
1f290 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74         /* Some t
1f2a0 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  erms not complet
1f2b0 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ely tested */.  
1f2c0 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2e0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1f2f0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20  nter */.    u16 
1f300 77 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20  wctrlFlags;     
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f320 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 75 62 2d  * Flags for sub-
1f330 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1f340 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45 78      Expr *pAndEx
1f350 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pr = 0;         
1f360 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e         /* An "..
1f370 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70 72   AND (...)" expr
1f380 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61  ession */.    Ta
1f390 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
1f3a0 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 0a  Item->pTab;.   .
1f3b0 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
1f3c0 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20  p->aLTerm[0];.  
1f3d0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
1f3e0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1f3f0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
1f400 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20  or & WO_OR );.  
1f410 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
1f420 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1f430 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20  _ORINFO)!=0 );. 
1f440 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72     pOrWc = &pTer
1f450 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
1f460 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1f470 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20   = OP_Return;.  
1f480 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72    pLevel->p1 = r
1f490 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f  egReturn;..    /
1f4a0 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20 53  * Set up a new S
1f4b0 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61 62  rcList in pOrTab
1f4c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1f4d0 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e  table being scan
1f4e0 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ned.    ** by th
1f4f0 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61  is loop in the a
1f500 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c  [0] slot and all
1f510 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73   notReady tables
1f520 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73   in a[1..] slots
1f530 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65  ..    ** This be
1f540 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73  comes the SrcLis
1f550 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  t in the recursi
1f560 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ve call to sqlit
1f570 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a  e3WhereBegin()..
1f580 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1f590 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20  WInfo->nLevel>1 
1f5a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f  ){.      int nNo
1f5b0 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
1f5c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1f5d0 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64  umber of notRead
1f5e0 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  y tables */.    
1f5f0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1f600 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20  _item *origSrc; 
1f610 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
1f620 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  list of tables *
1f630 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64  /.      nNotRead
1f640 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  y = pWInfo->nLev
1f650 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b  el - iLevel - 1;
1f660 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20  .      pOrTab = 
1f670 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f  sqlite3StackAllo
1f680 63 52 61 77 28 64 62 2c 0a 20 20 20 20 20 20 20  cRaw(db,.       
1f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6a0 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72       sizeof(*pOr
1f6b0 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a  Tab)+ nNotReady*
1f6c0 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61  sizeof(pOrTab->a
1f6d0 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  [0]));.      if(
1f6e0 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65 74   pOrTab==0 ) ret
1f6f0 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20  urn notReady;.  
1f700 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c      pOrTab->nAll
1f710 6f 63 20 3d 20 28 75 38 29 28 6e 4e 6f 74 52 65  oc = (u8)(nNotRe
1f720 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20 20  ady + 1);.      
1f730 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70  pOrTab->nSrc = p
1f740 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20  OrTab->nAlloc;. 
1f750 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72 54       memcpy(pOrT
1f760 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c  ab->a, pTabItem,
1f770 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74 65   sizeof(*pTabIte
1f780 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67 53  m));.      origS
1f790 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  rc = pWInfo->pTa
1f7a0 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  bList->a;.      
1f7b0 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74  for(k=1; k<=nNot
1f7c0 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20  Ready; k++){.   
1f7d0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f 72       memcpy(&pOr
1f7e0 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67  Tab->a[k], &orig
1f7f0 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46  Src[pLevel[k].iF
1f800 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72  rom], sizeof(pOr
1f810 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20  Tab->a[k]));.   
1f820 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1f830 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 70        pOrTab = p
1f840 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
1f850 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1f860 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 6f  nitialize the ro
1f870 77 73 65 74 20 72 65 67 69 73 74 65 72 20 74 6f  wset register to
1f880 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41   contain NULL. A
1f890 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20  n SQL NULL is . 
1f8a0 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74     ** equivalent
1f8b0 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f 77   to an empty row
1f8c0 73 65 74 2e 20 20 4f 72 2c 20 63 72 65 61 74 65  set.  Or, create
1f8d0 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
1f8e0 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 70 61 62  dex.    ** capab
1f8f0 6c 65 20 6f 66 20 68 6f 6c 64 69 6e 67 20 70 72  le of holding pr
1f900 69 6d 61 72 79 20 6b 65 79 73 20 69 6e 20 74 68  imary keys in th
1f910 65 20 63 61 73 65 20 6f 66 20 61 20 57 49 54 48  e case of a WITH
1f920 4f 55 54 20 52 4f 57 49 44 2e 0a 20 20 20 20 2a  OUT ROWID..    *
1f930 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e  *.    ** Also in
1f940 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75  itialize regRetu
1f950 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  rn to contain th
1f960 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
1f970 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20   instruction .  
1f980 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
1f990 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f   following the O
1f9a0 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65 20  P_Return at the 
1f9b0 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
1f9c0 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  op. This.    ** 
1f9d0 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 61  is required in a
1f9e0 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46   few obscure LEF
1f9f0 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65  T JOIN cases whe
1fa00 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  re control jumps
1fa10 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65  .    ** over the
1fa20 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   top of the loop
1fa30 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
1fa40 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61  f it. In this ca
1fa50 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  se the .    ** c
1fa60 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20  orrect response 
1fa70 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c  for the end-of-l
1fa80 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50  oop code (the OP
1fa90 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a  _Return) is to .
1faa0 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f      ** fall thro
1fab0 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
1fac0 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73  instruction, jus
1fad0 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20  t as an OP_Next 
1fae0 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63  does if.    ** c
1faf0 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e  alled on an unin
1fb00 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72  itialized cursor
1fb10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1fb20 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
1fb30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50  lags & WHERE_DUP
1fb40 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29  LICATES_OK)==0 )
1fb50 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52  {.      if( HasR
1fb60 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
1fb70 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20        regRowset 
1fb80 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1fb90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1fba0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1fbb0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f  P_Null, 0, regRo
1fbc0 77 73 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  wset);.      }el
1fbd0 73 65 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65  se{.        Inde
1fbe0 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33  x *pPk = sqlite3
1fbf0 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
1fc00 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 72  pTab);.        r
1fc10 65 67 52 6f 77 73 65 74 20 3d 20 70 50 61 72 73  egRowset = pPars
1fc20 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
1fc30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1fc40 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
1fc50 70 68 65 6d 65 72 61 6c 2c 20 72 65 67 52 6f 77  phemeral, regRow
1fc60 73 65 74 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  set, pPk->nKeyCo
1fc70 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
1fc80 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
1fc90 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 50 6b 29  nfo(pParse, pPk)
1fca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fcb0 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  regRowid = ++pPa
1fcc0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d  rse->nMem;.    }
1fcd0 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d 20  .    iRetInit = 
1fce0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fcf0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1fd00 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a   0, regReturn);.
1fd10 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
1fd20 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c  riginal WHERE cl
1fd30 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74 68 65  ause is z of the
1fd40 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20 78   form:  (x1 OR x
1fd50 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79 0a  2 OR ...) AND y.
1fd60 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72 20      ** Then for 
1fd70 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c 20 65  every term xN, e
1fd80 76 61 6c 75 61 74 65 20 61 73 20 74 68 65 20 73  valuate as the s
1fd90 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20 78 4e  ubexpression: xN
1fda0 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54 68   AND z.    ** Th
1fdb0 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20 69 6e  at way, terms in
1fdc0 20 79 20 74 68 61 74 20 61 72 65 20 66 61 63 74   y that are fact
1fdd0 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64 69  ored into the di
1fde0 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 20  sjunction will. 
1fdf0 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65 64 20     ** be picked 
1fe00 75 70 20 62 79 20 74 68 65 20 72 65 63 75 72 73  up by the recurs
1fe10 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ive calls to sql
1fe20 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
1fe30 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20   below..    **. 
1fe40 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20     ** Actually, 
1fe50 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69  each subexpressi
1fe60 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20  on is converted 
1fe70 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20 77 68  to "xN AND w" wh
1fe80 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a 2a 20  ere w is.    ** 
1fe90 74 68 65 20 22 69 6e 74 65 72 65 73 74 69 6e 67  the "interesting
1fea0 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20 74  " terms of z - t
1feb0 65 72 6d 73 20 74 68 61 74 20 64 69 64 20 6e 6f  erms that did no
1fec0 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  t originate in t
1fed0 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72 20  he.    ** ON or 
1fee0 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
1fef0 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64  a LEFT JOIN, and
1ff00 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20   terms that are 
1ff10 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20 20 2a  usable as .    *
1ff20 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  * indices..    *
1ff30 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 6f 70  *.    ** This op
1ff40 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73 6f 20  timization also 
1ff50 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 69 66 20  only applies if 
1ff60 74 68 65 20 28 78 31 20 4f 52 20 78 32 20 4f 52  the (x1 OR x2 OR
1ff70 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20 20 2a   ...) term.    *
1ff80 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  * is not contain
1ff90 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61  ed in the ON cla
1ffa0 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
1ffb0 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74  IN..    ** See t
1ffc0 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77 77 77  icket http://www
1ffd0 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f  .sqlite.org/src/
1ffe0 69 6e 66 6f 2f 66 32 33 36 39 33 30 34 65 34 0a  info/f2369304e4.
1fff0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
20000 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20  WC->nTerm>1 ){. 
20010 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a       int iTerm;.
20020 20 20 20 20 20 20 66 6f 72 28 69 54 65 72 6d 3d        for(iTerm=
20030 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54  0; iTerm<pWC->nT
20040 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20  erm; iTerm++){. 
20050 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
20060 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72  pr = pWC->a[iTer
20070 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m].pExpr;.      
20080 20 20 69 66 28 20 26 70 57 43 2d 3e 61 5b 69 54    if( &pWC->a[iT
20090 65 72 6d 5d 20 3d 3d 20 70 54 65 72 6d 20 29 20  erm] == pTerm ) 
200a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
200b0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
200c0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
200d0 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74  FromJoin) ) cont
200e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 74 65  inue;.        te
200f0 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61 5b 69  stcase( pWC->a[i
20100 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20  Term].wtFlags & 
20110 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 3b 0a 20  TERM_ORINFO );. 
20120 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20130 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77   pWC->a[iTerm].w
20140 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
20150 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20  RTUAL );.       
20160 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 54 65 72   if( pWC->a[iTer
20170 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m].wtFlags & (TE
20180 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 56  RM_ORINFO|TERM_V
20190 49 52 54 55 41 4c 29 20 29 20 63 6f 6e 74 69 6e  IRTUAL) ) contin
201a0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
201b0 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65  (pWC->a[iTerm].e
201c0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
201d0 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  L)==0 ) continue
201e0 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20  ;.        pExpr 
201f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
20200 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
20210 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
20220 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
20230 64 28 64 62 2c 20 70 41 6e 64 45 78 70 72 2c 20  d(db, pAndExpr, 
20240 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
20250 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78        if( pAndEx
20260 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  pr ){.        pA
20270 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ndExpr = sqlite3
20280 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
20290 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45 78 70  _AND, 0, pAndExp
202a0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
202b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 75 6e     }..    /* Run
202c0 20 61 20 73 65 70 61 72 61 74 65 20 57 48 45 52   a separate WHER
202d0 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63  E clause for eac
202e0 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  h term of the OR
202f0 20 63 6c 61 75 73 65 2e 20 20 41 66 74 65 72 0a   clause.  After.
20300 20 20 20 20 2a 2a 20 65 6c 69 6d 69 6e 61 74 69      ** eliminati
20310 6e 67 20 64 75 70 6c 69 63 61 74 65 73 20 66 72  ng duplicates fr
20320 6f 6d 20 6f 74 68 65 72 20 57 48 45 52 45 20 63  om other WHERE c
20330 6c 61 75 73 65 73 2c 20 74 68 65 20 61 63 74 69  lauses, the acti
20340 6f 6e 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20  on for each.    
20350 2a 2a 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61  ** sub-WHERE cla
20360 75 73 65 20 69 73 20 74 6f 20 74 6f 20 69 6e 76  use is to to inv
20370 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f  oke the main loo
20380 70 20 62 6f 64 79 20 61 73 20 61 20 73 75 62 72  p body as a subr
20390 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  outine..    */. 
203a0 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20     wctrlFlags = 
203b0 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e   WHERE_OMIT_OPEN
203c0 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52 45 5f 41  _CLOSE | WHERE_A
203d0 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20 20 20  ND_ONLY |.      
203e0 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
203f0 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20  E_FORCE_TABLE | 
20400 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
20410 4e 4c 59 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  NLY;.    for(ii=
20420 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65  0; ii<pOrWc->nTe
20430 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  rm; ii++){.     
20440 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
20450 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b  erm = &pOrWc->a[
20460 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ii];.      if( p
20470 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
20480 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72  or==iCur || (pOr
20490 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
204a0 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a  & WO_AND)!=0 ){.
204b0 20 20 20 20 20 20 20 20 57 68 65 72 65 49 6e 66          WhereInf
204c0 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20  o *pSubWInfo;   
204d0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20          /* Info 
204e0 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65  for single OR-te
204f0 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  rm scan */.     
20500 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78 70 72     Expr *pOrExpr
20510 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70   = pOrTerm->pExp
20520 72 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 4f 52  r; /* Current OR
20530 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
20540 20 20 20 20 20 20 20 20 69 6e 74 20 6a 31 20 3d          int j1 =
20550 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
20560 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
20570 73 73 20 6f 66 20 6a 75 6d 70 20 6f 70 65 72 61  ss of jump opera
20580 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
20590 69 66 28 20 70 41 6e 64 45 78 70 72 20 26 26 20  if( pAndExpr && 
205a0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
205b0 28 70 4f 72 45 78 70 72 2c 20 45 50 5f 46 72 6f  (pOrExpr, EP_Fro
205c0 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
205d0 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c      pAndExpr->pL
205e0 65 66 74 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20  eft = pOrExpr;. 
205f0 20 20 20 20 20 20 20 20 20 70 4f 72 45 78 70 72           pOrExpr
20600 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20 20 20   = pAndExpr;.   
20610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
20620 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  * Loop through t
20630 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61  able entries tha
20640 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72  t match term pOr
20650 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20  Term. */.       
20660 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c   pSubWInfo = sql
20670 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
20680 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70  Parse, pOrTab, p
20690 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20  OrExpr, 0, 0,.  
206a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206c0 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 2c 20      wctrlFlags, 
206d0 69 43 6f 76 43 75 72 29 3b 0a 20 20 20 20 20 20  iCovCur);.      
206e0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49    assert( pSubWI
206f0 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  nfo || pParse->n
20700 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
20710 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
20720 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
20730 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68   ){.          Wh
20740 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f  ereLoop *pSubLoo
20750 70 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  p;.          exp
20760 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20  lainOneScan(.   
20770 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
20780 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62  e, pOrTab, &pSub
20790 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65  WInfo->a[0], iLe
207a0 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72  vel, pLevel->iFr
207b0 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20  om, 0.          
207c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
207d0 54 68 69 73 20 69 73 20 74 68 65 20 73 75 62 2d  This is the sub-
207e0 57 48 45 52 45 20 63 6c 61 75 73 65 20 62 6f 64  WHERE clause bod
207f0 79 2e 20 20 46 69 72 73 74 20 73 6b 69 70 20 6f  y.  First skip o
20800 76 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ver.          **
20810 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20   duplicate rows 
20820 66 72 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d 57  from prior sub-W
20830 48 45 52 45 20 63 6c 61 75 73 65 73 2c 20 61 6e  HERE clauses, an
20840 64 20 72 65 63 6f 72 64 20 74 68 65 0a 20 20 20  d record the.   
20850 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20         ** rowid 
20860 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 29  (or PRIMARY KEY)
20870 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
20880 20 72 6f 77 20 73 6f 20 74 68 61 74 20 74 68 65   row so that the
20890 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20   same.          
208a0 2a 2a 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 73  ** row will be s
208b0 6b 69 70 70 65 64 20 69 6e 20 73 75 62 73 65 71  kipped in subseq
208c0 75 65 6e 74 20 73 75 62 2d 57 48 45 52 45 20 63  uent sub-WHERE c
208d0 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20  lauses..        
208e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
208f0 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
20900 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
20910 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30  UPLICATES_OK)==0
20920 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20930 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20  int r;.         
20940 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28     int iSet = ((
20950 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  ii==pOrWc->nTerm
20960 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20  -1)?-1:ii);.    
20970 20 20 20 20 20 20 20 20 69 66 28 20 48 61 73 52          if( HasR
20980 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
20990 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20              r = 
209a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
209b0 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
209c0 20 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c   pTab, -1, iCur,
209d0 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20   regRowid, 0);. 
209e0 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 31 20               j1 
209f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
20a00 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77  Op4Int(v, OP_Row
20a10 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77 73  SetTest, regRows
20a20 65 74 2c 20 30 2c 20 72 2c 69 53 65 74 29 3b 0a  et, 0, r,iSet);.
20a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
20a40 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
20a50 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
20a60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
20a70 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
20a80 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
20a90 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
20aa0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6b           int nPk
20ab0 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   = pPk->nKeyCol;
20ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
20ad0 6e 74 20 69 50 6b 3b 0a 0a 20 20 20 20 20 20 20  nt iPk;..       
20ae0 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
20af0 68 65 20 50 4b 20 69 6e 74 6f 20 61 6e 20 61 72  he PK into an ar
20b00 72 61 79 20 6f 66 20 74 65 6d 70 20 72 65 67 69  ray of temp regi
20b10 73 74 65 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20  sters. */.      
20b20 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69          r = sqli
20b30 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
20b40 70 50 61 72 73 65 2c 20 6e 50 6b 29 3b 0a 20 20  pParse, nPk);.  
20b50 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
20b60 69 50 6b 3d 30 3b 20 69 50 6b 3c 6e 50 6b 3b 20  iPk=0; iPk<nPk; 
20b70 69 50 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  iPk++){.        
20b80 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
20b90 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
20ba0 5b 69 50 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20  [iPk];.         
20bb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20bc0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
20bd0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43  pParse, pTab, iC
20be0 6f 6c 2c 20 69 43 75 72 2c 20 72 2b 69 50 6b 2c  ol, iCur, r+iPk,
20bf0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
20c00 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
20c10 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
20c20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 61  the temp table a
20c30 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20  lready contains 
20c40 74 68 69 73 20 6b 65 79 2e 20 49 66 20 73 6f 2c  this key. If so,
20c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
20c60 2a 20 74 68 65 20 72 6f 77 20 68 61 73 20 61 6c  * the row has al
20c70 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 6c 75  ready been inclu
20c80 64 65 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ded in the resul
20c90 74 20 73 65 74 20 61 6e 64 0a 20 20 20 20 20 20  t set and.      
20ca0 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62          ** can b
20cb0 65 20 69 67 6e 6f 72 65 64 20 28 62 79 20 6a 75  e ignored (by ju
20cc0 6d 70 69 6e 67 20 70 61 73 74 20 74 68 65 20 47  mping past the G
20cd0 6f 73 75 62 20 62 65 6c 6f 77 29 2e 20 4f 74 68  osub below). Oth
20ce0 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 20 20  erwise,.        
20cf0 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20        ** insert 
20d00 74 68 65 20 6b 65 79 20 69 6e 74 6f 20 74 68 65  the key into the
20d10 20 74 65 6d 70 20 74 61 62 6c 65 20 61 6e 64 20   temp table and 
20d20 70 72 6f 63 65 65 64 20 77 69 74 68 20 70 72 6f  proceed with pro
20d30 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 20 20  cessing.        
20d40 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 6f 77        ** the row
20d50 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20d60 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  **.             
20d70 20 2a 2a 20 55 73 65 20 73 6f 6d 65 20 6f 66 20   ** Use some of 
20d80 74 68 65 20 73 61 6d 65 20 6f 70 74 69 6d 69 7a  the same optimiz
20d90 61 74 69 6f 6e 73 20 61 73 20 4f 50 5f 52 6f 77  ations as OP_Row
20da0 53 65 74 54 65 73 74 3a 20 49 66 20 69 53 65 74  SetTest: If iSet
20db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
20dc0 2a 20 69 73 20 7a 65 72 6f 2c 20 61 73 73 75 6d  * is zero, assum
20dd0 65 20 74 68 61 74 20 74 68 65 20 6b 65 79 20 63  e that the key c
20de0 61 6e 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  annot already be
20df0 20 70 72 65 73 65 6e 74 20 69 6e 0a 20 20 20 20   present in.    
20e00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
20e10 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 41 6e 64   temp table. And
20e20 20 69 66 20 69 53 65 74 20 69 73 20 2d 31 2c 20   if iSet is -1, 
20e30 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 72  assume that ther
20e40 65 20 69 73 20 6e 6f 20 0a 20 20 20 20 20 20 20  e is no .       
20e50 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74         ** need t
20e60 6f 20 69 6e 73 65 72 74 20 74 68 65 20 6b 65 79  o insert the key
20e70 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
20e80 61 62 6c 65 2c 20 61 73 20 69 74 20 77 69 6c 6c  able, as it will
20e90 20 6e 65 76 65 72 20 0a 20 20 20 20 20 20 20 20   never .        
20ea0 20 20 20 20 20 20 2a 2a 20 62 65 20 74 65 73 74        ** be test
20eb0 65 64 20 66 6f 72 2e 20 20 2a 2f 20 0a 20 20 20  ed for.  */ .   
20ec0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
20ed0 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Set ){.         
20ee0 20 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69         j1 = sqli
20ef0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
20f00 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 72 65  (v, OP_Found, re
20f10 67 52 6f 77 73 65 74 2c 20 30 2c 20 72 2c 20 6e  gRowset, 0, r, n
20f20 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pk);.           
20f30 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
20f40 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
20f50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
20f60 20 20 20 20 69 66 28 20 69 53 65 74 3e 3d 30 20      if( iSet>=0 
20f70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
20f80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20f90 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
20fa0 65 63 6f 72 64 2c 20 72 2c 20 6e 50 6b 2c 20 72  ecord, r, nPk, r
20fb0 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
20fc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20fd0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
20fe0 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 72 65 67  P_IdxInsert, reg
20ff0 52 6f 77 73 65 74 2c 20 72 65 67 52 6f 77 69 64  Rowset, regRowid
21000 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
21010 20 20 20 20 20 20 69 66 28 20 69 53 65 74 20 29        if( iSet )
21020 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
21030 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55  geP5(v, OPFLAG_U
21040 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20  SESEEKRESULT);. 
21050 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a               }..
21060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21070 20 52 65 6c 65 61 73 65 20 74 68 65 20 61 72 72   Release the arr
21080 61 79 20 6f 66 20 74 65 6d 70 20 72 65 67 69 73  ay of temp regis
21090 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ters */.        
210a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
210b0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
210c0 61 72 73 65 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20  arse, r, nPk);. 
210d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
210e0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
210f0 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68      /* Invoke th
21100 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79  e main loop body
21110 20 61 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65   as a subroutine
21120 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
21130 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21140 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
21150 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64  Return, iLoopBod
21160 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  y);..          /
21170 2a 20 4a 75 6d 70 20 68 65 72 65 20 28 73 6b 69  * Jump here (ski
21180 70 70 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 6c  pping the main l
21190 6f 6f 70 20 62 6f 64 79 20 73 75 62 72 6f 75 74  oop body subrout
211a0 69 6e 65 29 20 69 66 20 74 68 65 0a 20 20 20 20  ine) if the.    
211b0 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
211c0 20 73 75 62 2d 57 48 45 52 45 20 72 6f 77 20 69   sub-WHERE row i
211d0 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 66 72  s a duplicate fr
211e0 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d 57 48 45  om prior sub-WHE
211f0 52 45 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  REs. */.        
21200 20 20 69 66 28 20 6a 31 20 29 20 73 71 6c 69 74    if( j1 ) sqlit
21210 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
21220 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 20 20 20 20  , j1);..        
21230 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e    /* The pSubWIn
21240 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
21250 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61  s flag means tha
21260 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20  t this OR term. 
21270 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74           ** cont
21280 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  ained one or mor
21290 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20  e AND term from 
212a0 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  a notReady table
212b0 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 20  .  The.         
212c0 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74   ** terms from t
212d0 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  he notReady tabl
212e0 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74  e could not be t
212f0 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20  ested and will. 
21300 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64           ** need
21310 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61   to be tested la
21320 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ter..          *
21330 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
21340 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
21350 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73  tedTerms ) untes
21360 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20  tedTerms = 1;.. 
21370 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
21380 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e  ll of the OR-con
21390 6e 65 63 74 65 64 20 74 65 72 6d 73 20 61 72 65  nected terms are
213a0 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
213b0 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
213c0 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e      ** index, an
213d0 64 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f  d the index is o
213e0 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20  pened using the 
213f0 73 61 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  same cursor numb
21400 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
21410 62 79 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20  by each call to 
21420 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
21430 6e 28 29 20 6d 61 64 65 20 62 79 20 74 68 69 73  n() made by this
21440 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20   loop, it may.  
21450 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 70 6f          ** be po
21460 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68  ssible to use th
21470 61 74 20 69 6e 64 65 78 20 61 73 20 61 20 63 6f  at index as a co
21480 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20  vering index..  
21490 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
214a0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 63       ** If the c
214b0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
214c0 65 72 65 42 65 67 69 6e 28 29 20 61 62 6f 76 65  ereBegin() above
214d0 20 72 65 73 75 6c 74 65 64 20 69 6e 20 61 20 73   resulted in a s
214e0 63 61 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20  can that.       
214f0 20 20 20 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e     ** uses an in
21500 64 65 78 2c 20 61 6e 64 20 74 68 69 73 20 69 73  dex, and this is
21510 20 65 69 74 68 65 72 20 74 68 65 20 66 69 72 73   either the firs
21520 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74  t OR-connected t
21530 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  erm.          **
21540 20 70 72 6f 63 65 73 73 65 64 20 6f 72 20 74 68   processed or th
21550 65 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 73  e index is the s
21560 61 6d 65 20 61 73 20 74 68 61 74 20 75 73 65 64  ame as that used
21570 20 62 79 20 61 6c 6c 20 70 72 65 76 69 6f 75 73   by all previous
21580 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
21590 72 6d 73 2c 20 73 65 74 20 70 43 6f 76 20 74 6f  rms, set pCov to
215a0 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 63   the candidate c
215b0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f  overing index. O
215c0 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 0a 20  therwise, set . 
215d0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 43 6f 76           ** pCov
215e0 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69   to NULL to indi
215f0 63 61 74 65 20 74 68 61 74 20 6e 6f 20 63 61 6e  cate that no can
21600 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20  didate covering 
21610 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20 20 20  index will .    
21620 20 20 20 20 20 20 2a 2a 20 62 65 20 61 76 61 69        ** be avai
21630 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 20  lable..         
21640 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 53   */.          pS
21650 75 62 4c 6f 6f 70 20 3d 20 70 53 75 62 57 49 6e  ubLoop = pSubWIn
21660 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b  fo->a[0].pWLoop;
21670 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
21680 74 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73  t( (pSubLoop->ws
21690 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
216a0 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a  TO_INDEX)==0 );.
216b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
216c0 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  SubLoop->wsFlags
216d0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
216e0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
216f0 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75  && (ii==0 || pSu
21700 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  bLoop->u.btree.p
21710 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20  Index==pCov).   
21720 20 20 20 20 20 20 20 20 26 26 20 28 48 61 73 52          && (HasR
21730 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49  owid(pTab) || !I
21740 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
21750 28 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72  (pSubLoop->u.btr
21760 65 65 2e 70 49 6e 64 65 78 29 29 0a 20 20 20 20  ee.pIndex)).    
21770 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
21780 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
21790 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64  bWInfo->a[0].iId
217a0 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b  xCur==iCovCur );
217b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
217c0 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e  v = pSubLoop->u.
217d0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
217e0 20 20 20 20 20 20 20 20 20 20 77 63 74 72 6c 46            wctrlF
217f0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45  lags |= WHERE_RE
21800 4f 50 45 4e 5f 49 44 58 3b 0a 20 20 20 20 20 20  OPEN_IDX;.      
21810 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21820 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b         pCov = 0;
21830 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
21840 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73          /* Finis
21850 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75  h the loop throu
21860 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
21870 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
21880 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
21890 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
218a0 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f  ereEnd(pSubWInfo
218b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
218c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
218d0 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
218e0 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28   = pCov;.    if(
218f0 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e   pCov ) pLevel->
21900 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75  iIdxCur = iCovCu
21910 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45  r;.    if( pAndE
21920 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e  xpr ){.      pAn
21930 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30  dExpr->pLeft = 0
21940 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
21950 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 41  xprDelete(db, pA
21960 6e 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  ndExpr);.    }. 
21970 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
21980 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e  angeP1(v, iRetIn
21990 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  it, sqlite3VdbeC
219a0 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
219b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
219c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
219d0 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
219e0 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  rBrk);.    sqlit
219f0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
21a00 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  el(v, iLoopBody)
21a10 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ;..    if( pWInf
21a20 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71  o->nLevel>1 ) sq
21a30 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64  lite3StackFree(d
21a40 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20  b, pOrTab);.    
21a50 69 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72  if( !untestedTer
21a60 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d  ms ) disableTerm
21a70 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
21a80 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
21a90 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
21aa0 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
21ab0 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61  /..  {.    /* Ca
21ac0 73 65 20 36 3a 20 20 54 68 65 72 65 20 69 73 20  se 6:  There is 
21ad0 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e  no usable index.
21ae0 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63    We must do a c
21af0 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20  omplete.    **  
21b00 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20          scan of 
21b10 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
21b20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
21b30 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
21b40 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74  ep[] = { OP_Next
21b50 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20  , OP_Prev };.   
21b60 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
21b70 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50   aStart[] = { OP
21b80 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74  _Rewind, OP_Last
21b90 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   };.    assert( 
21ba0 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d  bRev==0 || bRev=
21bb0 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  =1 );.    if( pT
21bc0 61 62 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73  abItem->isRecurs
21bd0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ive ){.      /* 
21be0 54 61 62 6c 65 73 20 6d 61 72 6b 65 64 20 69 73  Tables marked is
21bf0 52 65 63 75 72 73 69 76 65 20 68 61 76 65 20 6f  Recursive have o
21c00 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nly a single row
21c10 20 74 68 61 74 20 69 73 20 73 74 6f 72 65 64 20   that is stored 
21c20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 70 73  in.      ** a ps
21c30 65 75 64 6f 2d 63 75 72 73 6f 72 2e 20 20 4e 6f  eudo-cursor.  No
21c40 20 6e 65 65 64 20 74 6f 20 52 65 77 69 6e 64 20   need to Rewind 
21c50 6f 72 20 4e 65 78 74 20 73 75 63 68 20 63 75 72  or Next such cur
21c60 73 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  sors. */.      p
21c70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
21c80 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  oop;.    }else{.
21c90 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
21ca0 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a   = aStep[bRev];.
21cb0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31        pLevel->p1
21cc0 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70   = iCur;.      p
21cd0 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20  Level->p2 = 1 + 
21ce0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21cf0 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76  2(v, aStart[bRev
21d00 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
21d10 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
21d20 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d  erageIf(v, bRev=
21d30 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  =0);.      VdbeC
21d40 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
21d50 76 21 3d 30 29 3b 0a 20 20 20 20 20 20 70 4c 65  v!=0);.      pLe
21d60 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45  vel->p5 = SQLITE
21d70 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
21d80 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d  SCAN_STEP;.    }
21d90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  .  }..  /* Inser
21da0 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
21db0 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
21dc0 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
21dd0 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63  ompletely.  ** c
21de0 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68  omputed using th
21df0 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66  e current set of
21e00 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
21e10 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
21e20 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
21e30 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
21e40 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
21e50 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
21e60 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
21e70 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
21e80 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
21e90 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
21ea0 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
21eb0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
21ec0 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
21ed0 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
21ee0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21ef0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
21f00 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d  reqAll & pLevel-
21f10 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  >notReady)!=0 ){
21f20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21f30 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
21f40 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20  dTerms==0.      
21f50 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
21f60 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
21f70 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
21f80 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20  _ONLY)!=0 );.   
21f90 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73     pWInfo->untes
21fa0 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20  tedTerms = 1;.  
21fb0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
21fc0 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65    }.    pE = pTe
21fd0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
21fe0 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
21ff0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
22000 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78  iLeftJoin && !Ex
22010 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
22020 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
22030 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
22040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
22050 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
22060 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43  Parse, pE, addrC
22070 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
22080 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65  IFNULL);.    pTe
22090 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
220a0 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a  ERM_CODED;.  }..
220b0 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65    /* Insert code
220c0 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70   to test for imp
220d0 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73  lied constraints
220e0 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69   based on transi
220f0 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74  tivity.  ** of t
22100 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72  he "==" operator
22110 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
22120 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45 52  ple: If the WHER
22130 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
22140 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e  s "t1.a=t2.b" an
22150 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a  d "t2.b=123".  *
22160 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64  * and we are cod
22170 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ing the t1 loop 
22180 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  and the t2 loop 
22190 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65  has not yet code
221a0 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20  d,.  ** then we 
221b0 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22  cannot use the "
221c0 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74  t1.a=t2.b" const
221d0 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61  raint, but we ca
221e0 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20  n code.  ** the 
221f0 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32  implied "t1.a=12
22200 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  3" constraint.. 
22210 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   */.  for(pTerm=
22220 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e  pWC->a, j=pWC->n
22230 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
22240 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
22250 70 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a  pr *pE, *pEAlt;.
22260 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
22270 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54 65  Alt;.    if( pTe
22280 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
22290 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
222a0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
222b0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
222c0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28 57  m->eOperator!=(W
222d0 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29 20 29  O_EQUIV|WO_EQ) )
222e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
222f0 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
22300 72 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e  rsor!=iCur ) con
22310 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
22320 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
22330 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22340 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
22350 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
22360 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
22370 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  (pE, EP_FromJoin
22380 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
22390 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
223a0 69 67 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  ight & pLevel->n
223b0 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20  otReady)!=0 );. 
223c0 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54 65     pAlt = findTe
223d0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54  rm(pWC, iCur, pT
223e0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
223f0 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  n, notReady, WO_
22400 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
22410 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20    if( pAlt==0 ) 
22420 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
22430 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20  ( pAlt->wtFlags 
22440 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  & (TERM_CODED) )
22450 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74   continue;.    t
22460 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
22470 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
22480 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
22490 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f  ( pAlt->eOperato
224a0 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
224b0 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
224c0 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72  nt((v, "begin tr
224d0 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61  ansitive constra
224e0 69 6e 74 22 29 29 3b 0a 20 20 20 20 70 45 41 6c  int"));.    pEAl
224f0 74 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  t = sqlite3Stack
22500 41 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  AllocRaw(db, siz
22510 65 6f 66 28 2a 70 45 41 6c 74 29 29 3b 0a 20 20  eof(*pEAlt));.  
22520 20 20 69 66 28 20 70 45 41 6c 74 20 29 7b 0a 20    if( pEAlt ){. 
22530 20 20 20 20 20 2a 70 45 41 6c 74 20 3d 20 2a 70       *pEAlt = *p
22540 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  Alt->pExpr;.    
22550 20 20 70 45 41 6c 74 2d 3e 70 4c 65 66 74 20 3d    pEAlt->pLeft =
22560 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20   pE->pLeft;.    
22570 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
22580 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 41  alse(pParse, pEA
22590 6c 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  lt, addrCont, SQ
225a0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
225b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
225c0 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 45 41  tackFree(db, pEA
225d0 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  lt);.    }.  }..
225e0 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20    /* For a LEFT 
225f0 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65  OUTER JOIN, gene
22600 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
22610 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ill record the f
22620 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74  act that.  ** at
22630 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f   least one row o
22640 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
22650 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74 68  e has matched th
22660 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a  e left table.  .
22670 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65    */.  if( pLeve
22680 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
22690 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
226a0 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56  First = sqlite3V
226b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
226c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
226d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
226e0 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65  nteger, 1, pLeve
226f0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
22700 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
22710 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20  v, "record LEFT 
22720 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20  JOIN hit"));.   
22730 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
22740 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
22750 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
22760 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43  C->a, j=0; j<pWC
22770 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54  ->nTerm; j++, pT
22780 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65  erm++){.      te
22790 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
227a0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
227b0 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 74  RTUAL );.      t
227c0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
227d0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
227e0 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66  ODED );.      if
227f0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
22800 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
22810 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
22820 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
22830 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
22840 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  qAll & pLevel->n
22850 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20  otReady)!=0 ){. 
22860 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
22870 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
22880 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20  erms );.        
22890 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
228a0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
228b0 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  pTerm->pExpr );.
228c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
228d0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
228e0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61   pTerm->pExpr, a
228f0 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
22900 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
22910 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
22920 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
22930 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
22940 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  turn pLevel->not
22950 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 20 64 65  Ready;.}..#if de
22960 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
22970 5f 45 4e 41 42 4c 45 44 29 20 26 26 20 64 65 66  _ENABLED) && def
22980 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
22990 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29  LE_TREE_EXPLAIN)
229a0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
229b0 22 45 78 70 6c 61 6e 61 74 69 6f 6e 22 20 74 65  "Explanation" te
229c0 78 74 20 66 6f 72 20 61 20 57 68 65 72 65 54 65  xt for a WhereTe
229d0 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rm..*/.static vo
229e0 69 64 20 77 68 65 72 65 45 78 70 6c 61 69 6e 54  id whereExplainT
229f0 65 72 6d 28 56 64 62 65 20 2a 76 2c 20 57 68 65  erm(Vdbe *v, Whe
22a00 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a  reTerm *pTerm){.
22a10 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b    char zType[4];
22a20 0a 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c  .  memcpy(zType,
22a30 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 69 66   "...", 4);.  if
22a40 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
22a50 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
22a60 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56 27  ) zType[0] = 'V'
22a70 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65  ;.  if( pTerm->e
22a80 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
22a90 55 49 56 20 20 29 20 7a 54 79 70 65 5b 31 5d 20  UIV  ) zType[1] 
22aa0 3d 20 27 45 27 3b 0a 20 20 69 66 28 20 45 78 70  = 'E';.  if( Exp
22ab0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
22ac0 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
22ad0 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b  omJoin) ) zType[
22ae0 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 73 71 6c 69  2] = 'L';.  sqli
22af0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
22b00 28 76 2c 20 22 25 73 20 22 2c 20 7a 54 79 70 65  (v, "%s ", zType
22b10 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  );.  sqlite3Expl
22b20 61 69 6e 45 78 70 72 28 76 2c 20 70 54 65 72 6d  ainExpr(v, pTerm
22b30 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 23 65 6e 64  ->pExpr);.}.#end
22b40 69 66 20 2f 2a 20 57 48 45 52 45 54 52 41 43 45  if /* WHERETRACE
22b50 5f 45 4e 41 42 4c 45 44 20 26 26 20 53 51 4c 49  _ENABLED && SQLI
22b60 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
22b70 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 23 69 66 64  XPLAIN */...#ifd
22b80 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
22b90 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ABLED./*.** Prin
22ba0 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  t a WhereLoop ob
22bb0 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67 67 69  ject for debuggi
22bc0 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73  ng purposes.*/.s
22bd0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
22be0 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c  LoopPrint(WhereL
22bf0 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61  oop *p, WhereCla
22c00 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65  use *pWC){.  Whe
22c10 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
22c20 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20   pWC->pWInfo;.  
22c30 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e  int nb = 1+(pWIn
22c40 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
22c50 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63  rc+7)/8;.  struc
22c60 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
22c70 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
22c80 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d  pTabList->a + p-
22c90 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a  >iTab;.  Table *
22ca0 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
22cb0 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  ab;.  sqlite3Deb
22cc0 75 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e  ugPrintf("%c%2d.
22cd0 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20  %0*llx.%0*llx", 
22ce0 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20  p->cId,.        
22cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
22d00 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73  iTab, nb, p->mas
22d10 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72  kSelf, nb, p->pr
22d20 65 72 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33  ereq);.  sqlite3
22d30 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31  DebugPrintf(" %1
22d40 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2s",.           
22d50 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
22d60 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d  >zAlias ? pItem-
22d70 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e  >zAlias : pTab->
22d80 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70  zName);.  if( (p
22d90 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
22da0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
22db0 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
22dc0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
22dd0 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e   if( p->u.btree.
22de0 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65  pIndex && (zName
22df0 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49   = p->u.btree.pI
22e00 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20  ndex->zName)!=0 
22e10 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
22e20 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  ncmp(zName, "sql
22e30 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c  ite_autoindex_",
22e40 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   17)==0 ){.     
22e50 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74     int i = sqlit
22e60 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
22e70 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77  ) - 1;.        w
22e80 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d  hile( zName[i]!=
22e90 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20  '_' ) i--;.     
22ea0 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20     zName += i;. 
22eb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
22ec0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22ed0 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e  ".%-16s %2d", zN
22ee0 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  ame, p->u.btree.
22ef0 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nEq);.    }else{
22f00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
22f10 62 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22  bugPrintf("%20s"
22f20 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ,"");.    }.  }e
22f30 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
22f40 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76  ;.    if( p->u.v
22f50 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20  tab.idxStr ){.  
22f60 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
22f70 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25  mprintf("(%d,\"%
22f80 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20  s\",%x)",.      
22f90 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76            p->u.v
22fa0 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75  tab.idxNum, p->u
22fb0 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d  .vtab.idxStr, p-
22fc0 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
22fd0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
22fe0 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
22ff0 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29  mprintf("(%d,%x)
23000 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  ", p->u.vtab.idx
23010 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f  Num, p->u.vtab.o
23020 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a  mitMask);.    }.
23030 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23040 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c  Printf(" %-19s",
23050 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   z);.    sqlite3
23060 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20  _free(z);.  }.  
23070 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26  if( p->wsFlags &
23080 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20   WHERE_SKIPSCAN 
23090 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
230a0 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30  bugPrintf(" f %0
230b0 35 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73  5x %d-%d", p->ws
230c0 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d  Flags, p->nLTerm
230d0 2c 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  ,p->u.btree.nSki
230e0 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
230f0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23100 6e 74 66 28 22 20 66 20 25 30 35 78 20 4e 20 25  ntf(" f %05x N %
23110 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20  d", p->wsFlags, 
23120 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a  p->nLTerm);.  }.
23130 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23140 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25  intf(" cost %d,%
23150 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74  d,%d\n", p->rSet
23160 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e  up, p->rRun, p->
23170 6e 4f 75 74 29 3b 0a 23 69 66 64 65 66 20 53 51  nOut);.#ifdef SQ
23180 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
23190 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66  _EXPLAIN.  /* If
231a0 20 74 68 65 20 30 78 31 30 30 20 62 69 74 20 6f   the 0x100 bit o
231b0 66 20 77 68 65 72 65 74 72 61 63 69 6e 67 20 69  f wheretracing i
231c0 73 20 73 65 74 2c 20 74 68 65 6e 20 73 68 6f 77  s set, then show
231d0 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6e 73   all of the cons
231e0 74 72 61 69 6e 74 0a 20 20 2a 2a 20 65 78 70 72  traint.  ** expr
231f0 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
23200 68 65 72 65 4c 6f 6f 70 2e 61 4c 54 65 72 6d 5b  hereLoop.aLTerm[
23210 5d 20 61 72 72 61 79 2e 0a 20 20 2a 2f 0a 20 20  ] array..  */.  
23220 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26  if( p->nLTerm &&
23230 20 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   (sqlite3WhereTr
23240 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20  ace & 0x100)!=0 
23250 29 7b 20 20 2f 2a 20 57 48 45 52 45 54 52 41 43  ){  /* WHERETRAC
23260 45 20 30 78 31 30 30 20 2a 2f 0a 20 20 20 20 69  E 0x100 */.    i
23270 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt i;.    Vdbe *
23280 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  v = pWInfo->pPar
23290 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 73  se->pVdbe;.    s
232a0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42 65 67  qlite3ExplainBeg
232b0 69 6e 28 76 29 3b 0a 20 20 20 20 66 6f 72 28 69  in(v);.    for(i
232c0 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b  =0; i<p->nLTerm;
232d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65   i++){.      Whe
232e0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20  reTerm *pTerm = 
232f0 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3b 0a 20 20  p->aLTerm[i];.  
23300 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
23310 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23320 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
23330 6e 50 72 69 6e 74 66 28 76 2c 20 22 20 20 28 25  nPrintf(v, "  (%
23340 64 29 20 23 25 2d 32 64 20 22 2c 20 69 2b 31 2c  d) #%-2d ", i+1,
23350 20 28 69 6e 74 29 28 70 54 65 72 6d 2d 70 57 43   (int)(pTerm-pWC
23360 2d 3e 61 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ->a));.      sql
23370 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28  ite3ExplainPush(
23380 76 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 45  v);.      whereE
23390 78 70 6c 61 69 6e 54 65 72 6d 28 76 2c 20 70 54  xplainTerm(v, pT
233a0 65 72 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  erm);.      sqli
233b0 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 76 29  te3ExplainPop(v)
233c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
233d0 78 70 6c 61 69 6e 4e 4c 28 76 29 3b 0a 20 20 20  xplainNL(v);.   
233e0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
233f0 70 6c 61 69 6e 46 69 6e 69 73 68 28 76 29 3b 0a  plainFinish(v);.
23400 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23410 50 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  Printf("%s", sql
23420 69 74 65 33 56 64 62 65 45 78 70 6c 61 6e 61 74  ite3VdbeExplanat
23430 69 6f 6e 28 76 29 29 3b 0a 20 20 7d 0a 23 65 6e  ion(v));.  }.#en
23440 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  dif.}.#endif../*
23450 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b  .** Convert bulk
23460 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76   memory into a v
23470 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70 20 74  alid WhereLoop t
23480 68 61 74 20 63 61 6e 20 62 65 20 70 61 73 73 65  hat can be passe
23490 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f  d.** to whereLoo
234a0 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73 73 6c  pClear harmlessl
234b0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
234c0 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28  d whereLoopInit(
234d0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
234e0 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e   p->aLTerm = p->
234f0 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20 70  aLTermSpace;.  p
23500 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
23510 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61  p->nLSlot = Arra
23520 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53  ySize(p->aLTermS
23530 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c  pace);.  p->wsFl
23540 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ags = 0;.}../*.*
23550 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68 65 72  * Clear the Wher
23560 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20  eLoop.u union.  
23570 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e  Leave WhereLoop.
23580 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a  pLTerm intact..*
23590 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
235a0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f  ereLoopClearUnio
235b0 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  n(sqlite3 *db, W
235c0 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
235d0 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26  if( p->wsFlags &
235e0 20 28 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54   (WHERE_VIRTUALT
235f0 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f  ABLE|WHERE_AUTO_
23600 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 69 66  INDEX) ){.    if
23610 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
23620 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
23630 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76  LE)!=0 && p->u.v
23640 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a  tab.needFree ){.
23650 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23660 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  ee(p->u.vtab.idx
23670 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75  Str);.      p->u
23680 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
23690 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76   0;.      p->u.v
236a0 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a  tab.idxStr = 0;.
236b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
236c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
236d0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
236e0 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70   && p->u.btree.p
236f0 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20  Index!=0 ){.    
23700 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
23710 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  db, p->u.btree.p
23720 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b  Index->zColAff);
23730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65  .      sqlite3Ke
23740 79 49 6e 66 6f 55 6e 72 65 66 28 70 2d 3e 75 2e  yInfoUnref(p->u.
23750 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 70 4b  btree.pIndex->pK
23760 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  eyInfo);.      s
23770 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
23780 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
23790 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  ex);.      p->u.
237a0 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
237b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
237c0 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
237d0 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20  internal memory 
237e0 75 73 65 64 20 62 79 20 61 20 57 68 65 72 65 4c  used by a WhereL
237f0 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  oop object.*/.st
23800 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
23810 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74 65 33  oopClear(sqlite3
23820 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
23830 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c  *p){.  if( p->aL
23840 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53  Term!=p->aLTermS
23850 70 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62  pace ) sqlite3Db
23860 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65  Free(db, p->aLTe
23870 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  rm);.  whereLoop
23880 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70  ClearUnion(db, p
23890 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  );.  whereLoopIn
238a0 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  it(p);.}../*.** 
238b0 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d 65 6d  Increase the mem
238c0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
238d0 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  or pLoop->aLTerm
238e0 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73  [] to be at leas
238f0 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  t n..*/.static i
23900 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  nt whereLoopResi
23910 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ze(sqlite3 *db, 
23920 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e  WhereLoop *p, in
23930 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54 65 72  t n){.  WhereTer
23940 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28  m **paNew;.  if(
23950 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20   p->nLSlot>=n ) 
23960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23970 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37  ;.  n = (n+7)&~7
23980 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71 6c 69  ;.  paNew = sqli
23990 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
239a0 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54  b, sizeof(p->aLT
239b0 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66  erm[0])*n);.  if
239c0 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65 74  ( paNew==0 ) ret
239d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
239e0 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65 77  ;.  memcpy(paNew
239f0 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a  , p->aLTerm, siz
23a00 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  eof(p->aLTerm[0]
23a10 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20  )*p->nLSlot);.  
23a20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70  if( p->aLTerm!=p
23a30 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20  ->aLTermSpace ) 
23a40 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23a50 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20  , p->aLTerm);.  
23a60 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e 65  p->aLTerm = paNe
23a70 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d  w;.  p->nLSlot =
23a80 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   n;.  return SQL
23a90 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
23aa0 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65 6e   Transfer conten
23ab0 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  t from the secon
23ac0 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68 65  d pLoop into the
23ad0 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69   first..*/.stati
23ae0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 58  c int whereLoopX
23af0 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  fer(sqlite3 *db,
23b00 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c   WhereLoop *pTo,
23b10 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72 6f   WhereLoop *pFro
23b20 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  m){.  whereLoopC
23b30 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54  learUnion(db, pT
23b40 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c  o);.  if( whereL
23b50 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 54  oopResize(db, pT
23b60 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d  o, pFrom->nLTerm
23b70 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ) ){.    memset(
23b80 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a 65  &pTo->u, 0, size
23b90 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20 20  of(pTo->u));.   
23ba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
23bb0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63  OMEM;.  }.  memc
23bc0 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57  py(pTo, pFrom, W
23bd0 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53  HERE_LOOP_XFER_S
23be0 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f  Z);.  memcpy(pTo
23bf0 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d  ->aLTerm, pFrom-
23c00 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c  >aLTerm, pTo->nL
23c10 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d  Term*sizeof(pTo-
23c20 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20  >aLTerm[0]));.  
23c30 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61  if( pFrom->wsFla
23c40 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
23c50 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 70  ALTABLE ){.    p
23c60 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  From->u.vtab.nee
23c70 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dFree = 0;.  }el
23c80 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77  se if( (pFrom->w
23c90 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
23ca0 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b  UTO_INDEX)!=0 ){
23cb0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74  .    pFrom->u.bt
23cc0 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ree.pIndex = 0;.
23cd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
23ce0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
23cf0 20 44 65 6c 65 74 65 20 61 20 57 68 65 72 65 4c   Delete a WhereL
23d00 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  oop object.*/.st
23d10 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
23d20 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69 74 65  oopDelete(sqlite
23d30 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
23d40 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f   *p){.  whereLoo
23d50 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a 20  pClear(db, p);. 
23d60 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
23d70 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
23d80 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f  Free a WhereInfo
23d90 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74   structure.*/.st
23da0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 49  atic void whereI
23db0 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20  nfoFree(sqlite3 
23dc0 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a  *db, WhereInfo *
23dd0 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41  pWInfo){.  if( A
23de0 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b  LWAYS(pWInfo) ){
23df0 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65  .    whereClause
23e00 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73  Clear(&pWInfo->s
23e10 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  WC);.    while( 
23e20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29  pWInfo->pLoops )
23e30 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f  {.      WhereLoo
23e40 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  p *p = pWInfo->p
23e50 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57 49  Loops;.      pWI
23e60 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d  nfo->pLoops = p-
23e70 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20  >pNextLoop;.    
23e80 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74    whereLoopDelet
23e90 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  e(db, p);.    }.
23ea0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
23eb0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
23ec0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
23ed0 72 6e 20 54 52 55 45 20 69 66 20 62 6f 74 68 20  rn TRUE if both 
23ee0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
23ef0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
23f00 20 20 20 28 31 29 20 20 58 20 68 61 73 20 74 68     (1)  X has th
23f10 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20  e same or lower 
23f20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20 20  cost that Y.**  
23f30 20 28 32 29 20 20 58 20 69 73 20 61 20 70 72 6f   (2)  X is a pro
23f40 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 0a  per subset of Y.
23f50 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f 70 65 72  **.** By "proper
23f60 20 73 75 62 73 65 74 22 20 77 65 20 6d 65 61 6e   subset" we mean
23f70 20 74 68 61 74 20 58 20 75 73 65 73 20 66 65 77   that X uses few
23f80 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  er WHERE clause 
23f90 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e 20 59 20  terms.** than Y 
23fa0 61 6e 64 20 74 68 61 74 20 65 76 65 72 79 20 57  and that every W
23fb0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
23fc0 20 75 73 65 64 20 62 79 20 58 20 69 73 20 61 6c   used by X is al
23fd0 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79 20 59 2e  so used.** by Y.
23fe0 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 61  .**.** If X is a
23ff0 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
24000 66 20 59 20 74 68 65 6e 20 59 20 69 73 20 61 20  f Y then Y is a 
24010 62 65 74 74 65 72 20 63 68 6f 69 63 65 20 61 6e  better choice an
24020 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61  d ought.** to ha
24030 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e  ve a lower cost.
24040 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
24050 65 74 75 72 6e 73 20 54 52 55 45 20 77 68 65 6e  eturns TRUE when
24060 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72   that cost .** r
24070 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73 20 69  elationship is i
24080 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65 65 64  nverted and need
24090 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64  s to be adjusted
240a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
240b0 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72  whereLoopCheaper
240c0 50 72 6f 70 65 72 53 75 62 73 65 74 28 0a 20 20  ProperSubset(.  
240d0 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  const WhereLoop 
240e0 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  *pX,       /* Fi
240f0 72 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  rst WhereLoop to
24100 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f   compare */.  co
24110 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
24120 59 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70  Y        /* Comp
24130 61 72 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  are against this
24140 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b   WhereLoop */.){
24150 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
24160 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 20 3e 3d  f( pX->nLTerm >=
24170 20 70 59 2d 3e 6e 4c 54 65 72 6d 20 29 20 72 65   pY->nLTerm ) re
24180 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20  turn 0; /* X is 
24190 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20  not a subset of 
241a0 59 20 2a 2f 0a 20 20 69 66 28 20 70 58 2d 3e 72  Y */.  if( pX->r
241b0 52 75 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20  Run >= pY->rRun 
241c0 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 72  ){.    if( pX->r
241d0 52 75 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29  Run > pY->rRun )
241e0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
241f0 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68   X costs more th
24200 61 6e 20 59 20 2a 2f 0a 20 20 20 20 69 66 28 20  an Y */.    if( 
24210 70 58 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e  pX->nOut > pY->n
24220 4f 75 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  Out ) return 0; 
24230 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f     /* X costs mo
24240 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d  re than Y */.  }
24250 0a 20 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54  .  for(i=pX->nLT
24260 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  erm-1; i>=0; i--
24270 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d  ){.    for(j=pY-
24280 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b  >nLTerm-1; j>=0;
24290 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28   j--){.      if(
242a0 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d   pY->aLTerm[j]==
242b0 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20  pX->aLTerm[i] ) 
242c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
242d0 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72   if( j<0 ) retur
242e0 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61  n 0;  /* X not a
242f0 20 73 75 62 73 65 74 20 6f 66 20 59 20 73 69 6e   subset of Y sin
24300 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74  ce term X[i] not
24310 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20 20   used by Y */.  
24320 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f  }.  return 1;  /
24330 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73  * All conditions
24340 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a   meet */.}../*.*
24350 2a 20 54 72 79 20 74 6f 20 61 64 6a 75 73 74 20  * Try to adjust 
24360 74 68 65 20 63 6f 73 74 20 6f 66 20 57 68 65 72  the cost of Wher
24370 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65 20  eLoop pTemplate 
24380 75 70 77 61 72 64 73 20 6f 72 20 64 6f 77 6e 77  upwards or downw
24390 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a  ards so.** that:
243a0 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54 65  .**.**   (1) pTe
243b0 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6c 65 73  mplate costs les
243c0 73 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72  s than any other
243d0 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 68 61 74   WhereLoops that
243e0 20 61 72 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a   are a proper.**
243f0 20 20 20 20 20 20 20 73 75 62 73 65 74 20 6f 66         subset of
24400 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a   pTemplate.**.**
24410 20 20 20 28 32 29 20 70 54 65 6d 70 6c 61 74 65     (2) pTemplate
24420 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
24430 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65   any other Where
24440 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69 63 68 20  Loops for which 
24450 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20  pTemplate.**    
24460 20 20 20 69 73 20 61 20 70 72 6f 70 65 72 20 73     is a proper s
24470 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ubset..**.** To 
24480 73 61 79 20 22 57 68 65 72 65 4c 6f 6f 70 20 58  say "WhereLoop X
24490 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
244a0 73 65 74 20 6f 66 20 59 22 20 6d 65 61 6e 73 20  set of Y" means 
244b0 74 68 61 74 20 58 20 75 73 65 73 20 66 65 77 65  that X uses fewe
244c0 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  r.** WHERE claus
244d0 65 20 74 65 72 6d 73 20 74 68 61 6e 20 59 20 61  e terms than Y a
244e0 6e 64 20 74 68 61 74 20 65 76 65 72 79 20 57 48  nd that every WH
244f0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
24500 75 73 65 64 20 62 79 20 58 20 69 73 0a 2a 2a 20  used by X is.** 
24510 61 6c 73 6f 20 75 73 65 64 20 62 79 20 59 2e 0a  also used by Y..
24520 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 64 6a 75 73  **.** This adjus
24530 74 6d 65 6e 74 20 69 73 20 6f 6d 69 74 74 65 64  tment is omitted
24540 20 66 6f 72 20 53 4b 49 50 53 43 41 4e 20 6c 6f   for SKIPSCAN lo
24550 6f 70 73 2e 20 20 49 6e 20 61 20 53 4b 49 50 53  ops.  In a SKIPS
24560 43 41 4e 20 6c 6f 6f 70 2c 20 74 68 65 0a 2a 2a  CAN loop, the.**
24570 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4c 54 65 72   WhereLoop.nLTer
24580 6d 20 66 69 65 6c 64 20 69 73 20 6e 6f 74 20 61  m field is not a
24590 6e 20 61 63 63 75 72 61 74 65 20 6d 65 61 73 75  n accurate measu
245a0 72 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  re of the number
245b0 20 6f 66 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61   of WHERE.** cla
245c0 75 73 65 20 74 65 72 6d 73 20 63 6f 76 65 72 65  use terms covere
245d0 64 2c 20 73 69 6e 63 65 20 73 6f 6d 65 20 6f 66  d, since some of
245e0 20 74 68 65 20 66 69 72 73 74 20 6e 4c 54 65 72   the first nLTer
245f0 6d 20 65 6e 74 72 69 65 73 20 69 6e 20 61 4c 54  m entries in aLT
24600 65 72 6d 5b 5d 0a 2a 2a 20 77 69 6c 6c 20 62 65  erm[].** will be
24610 20 4e 55 4c 4c 20 28 62 65 63 61 75 73 65 20 74   NULL (because t
24620 68 65 79 20 61 72 65 20 73 6b 69 70 70 65 64 29  hey are skipped)
24630 2e 20 20 54 68 61 74 20 6d 61 6b 65 73 20 69 74  .  That makes it
24640 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74 0a   more difficult.
24650 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 68  ** to compare th
24660 65 20 6c 6f 6f 70 73 2e 20 20 57 65 20 63 6f 75  e loops.  We cou
24670 6c 64 20 61 64 64 20 65 78 74 72 61 20 63 6f 64  ld add extra cod
24680 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70  e to do the comp
24690 61 72 69 73 6f 6e 2c 20 61 6e 64 0a 2a 2a 20 70  arison, and.** p
246a0 65 72 68 61 70 73 20 77 65 20 77 69 6c 6c 20 73  erhaps we will s
246b0 6f 6d 65 64 61 79 2e 20 20 42 75 74 20 53 4b 49  omeday.  But SKI
246c0 50 53 43 41 4e 20 69 73 20 73 75 66 66 69 63 69  PSCAN is suffici
246d0 65 6e 74 6c 79 20 75 6e 63 6f 6d 6d 6f 6e 2c 20  ently uncommon, 
246e0 61 6e 64 20 74 68 69 73 0a 2a 2a 20 61 64 6a 75  and this.** adju
246f0 73 74 6d 65 6e 74 20 69 73 20 73 75 66 66 69 63  stment is suffic
24700 69 65 6e 74 20 6d 69 6e 6f 72 2c 20 74 68 61 74  ient minor, that
24710 20 69 74 20 69 73 20 76 65 72 79 20 64 69 66 66   it is very diff
24720 69 63 75 6c 74 20 74 6f 20 63 6f 6e 73 74 72 75  icult to constru
24730 63 74 0a 2a 2a 20 61 20 74 65 73 74 20 63 61 73  ct.** a test cas
24740 65 20 77 68 65 72 65 20 74 68 65 20 65 78 74 72  e where the extr
24750 61 20 63 6f 64 65 20 77 6f 75 6c 64 20 69 6d 70  a code would imp
24760 72 6f 76 65 20 74 68 65 20 71 75 65 72 79 20 70  rove the query p
24770 6c 61 6e 2e 20 20 42 65 74 74 65 72 0a 2a 2a 20  lan.  Better.** 
24780 74 6f 20 61 76 6f 69 64 20 74 68 65 20 61 64 64  to avoid the add
24790 65 64 20 63 6f 6d 70 6c 65 78 69 74 79 20 61 6e  ed complexity an
247a0 64 20 6a 75 73 74 20 6f 6d 69 74 20 63 6f 73 74  d just omit cost
247b0 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20   adjustments to 
247c0 53 4b 49 50 53 43 41 4e 0a 2a 2a 20 6c 6f 6f 70  SKIPSCAN.** loop
247d0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
247e0 64 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73  d whereLoopAdjus
247f0 74 43 6f 73 74 28 63 6f 6e 73 74 20 57 68 65 72  tCost(const Wher
24800 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c  eLoop *p, WhereL
24810 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
24820 0a 20 20 69 66 28 20 28 70 54 65 6d 70 6c 61 74  .  if( (pTemplat
24830 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
24840 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29  RE_INDEXED)==0 )
24850 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
24860 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61  pTemplate->wsFla
24870 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53  gs & WHERE_SKIPS
24880 43 41 4e 29 21 3d 30 20 29 20 72 65 74 75 72 6e  CAN)!=0 ) return
24890 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70  ;.  for(; p; p=p
248a0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20  ->pNextLoop){.  
248b0 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
248c0 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29  Template->iTab )
248d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
248e0 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
248f0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
24900 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
24910 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
24920 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53  gs & WHERE_SKIPS
24930 43 41 4e 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  CAN)!=0 ) contin
24940 75 65 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72  ue;.    if( wher
24950 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70  eLoopCheaperProp
24960 65 72 53 75 62 73 65 74 28 70 2c 20 70 54 65 6d  erSubset(p, pTem
24970 70 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  plate) ){.      
24980 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c  /* Adjust pTempl
24990 61 74 65 20 63 6f 73 74 20 64 6f 77 6e 77 61 72  ate cost downwar
249a0 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  d so that it is 
249b0 63 68 65 61 70 65 72 20 74 68 61 6e 20 69 74 73  cheaper than its
249c0 20 0a 20 20 20 20 20 20 2a 2a 20 73 75 62 73 65   .      ** subse
249d0 74 20 70 20 2a 2f 0a 20 20 20 20 20 20 70 54 65  t p */.      pTe
249e0 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70  mplate->rRun = p
249f0 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54  ->rRun;.      pT
24a00 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20  emplate->nOut = 
24a10 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20  p->nOut - 1;.   
24a20 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72 65   }else if( where
24a30 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65  LoopCheaperPrope
24a40 72 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61 74  rSubset(pTemplat
24a50 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20 2f  e, p) ){.      /
24a60 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61  * Adjust pTempla
24a70 74 65 20 63 6f 73 74 20 75 70 77 61 72 64 20 73  te cost upward s
24a80 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 6f 73  o that it is cos
24a90 74 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69 6e  tlier than p sin
24aa0 63 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65 6d  ce.      ** pTem
24ab0 70 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70 65  plate is a prope
24ac0 72 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a 2f  r subset of p */
24ad0 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
24ae0 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e  ->rRun = p->rRun
24af0 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  ;.      pTemplat
24b00 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75  e->nOut = p->nOu
24b10 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  t + 1;.    }.  }
24b20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
24b30 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65   the list of Whe
24b40 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72  reLoops in *ppPr
24b50 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  ev looking for o
24b60 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a  ne that can be.*
24b70 2a 20 73 75 70 70 6c 61 6e 74 65 64 20 62 79 20  * supplanted by 
24b80 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a  pTemplate..**.**
24b90 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
24ba0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69  the WhereLoop li
24bb0 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65  st contains an e
24bc0 6e 74 72 79 20 74 68 61 74 20 63 61 6e 20 73 75  ntry that can su
24bd0 70 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c  pplant.** pTempl
24be0 61 74 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ate, in other wo
24bf0 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65  rds if pTemplate
24c00 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67   does not belong
24c10 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a   on the list..**
24c20 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20 57  .** If pX is a W
24c30 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54  hereLoop that pT
24c40 65 6d 70 6c 61 74 65 20 63 61 6e 20 73 75 70 70  emplate can supp
24c50 6c 61 6e 74 2c 20 74 68 65 6e 20 72 65 74 75 72  lant, then retur
24c60 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68  n the.** link th
24c70 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e  at points to pX.
24c80 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c  .**.** If pTempl
24c90 61 74 65 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c  ate cannot suppl
24ca0 61 6e 74 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ant any existing
24cb0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
24cc0 6c 69 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a  list but needs.*
24cd0 2a 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  * to be added to
24ce0 20 74 68 65 20 6c 69 73 74 2c 20 74 68 65 6e 20   the list, then 
24cf0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
24d00 20 74 6f 20 74 68 65 20 74 61 69 6c 20 6f 66 20   to the tail of 
24d10 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
24d20 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  tic WhereLoop **
24d30 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
24d40 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ser(.  WhereLoop
24d50 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e   **ppPrev,.  con
24d60 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  st WhereLoop *pT
24d70 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65  emplate.){.  Whe
24d80 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72  reLoop *p;.  for
24d90 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b  (p=(*ppPrev); p;
24da0 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78   ppPrev=&p->pNex
24db0 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76  tLoop, p=*ppPrev
24dc0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54  ){.    if( p->iT
24dd0 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  ab!=pTemplate->i
24de0 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49  Tab || p->iSortI
24df0 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  dx!=pTemplate->i
24e00 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20  SortIdx ){.     
24e10 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74 68   /* If either th
24e20 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49  e iTab or iSortI
24e30 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77  dx values for tw
24e40 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20  o WhereLoop are 
24e50 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20  different.      
24e60 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68  ** then those Wh
24e70 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f  ereLoops need to
24e80 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73   be considered s
24e90 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74  eparately.  Neit
24ea0 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  her is.      ** 
24eb0 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72  a candidate to r
24ec0 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72  eplace the other
24ed0 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  . */.      conti
24ee0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  nue;.    }.    /
24ef0 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * In the current
24f00 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c   implementation,
24f10 20 74 68 65 20 72 53 65 74 75 70 20 76 61 6c 75   the rSetup valu
24f20 65 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f  e is either zero
24f30 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63  .    ** or the c
24f40 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20  ost of building 
24f50 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
24f60 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74  ex (NlogN) and t
24f70 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20  he NlogN.    ** 
24f80 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20  is the same for 
24f90 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65  compatible Where
24fa0 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73  Loops. */.    as
24fb0 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d  sert( p->rSetup=
24fc0 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d  =0 || pTemplate-
24fd0 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20  >rSetup==0 .    
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
24ff0 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70  p->rSetup==pTemp
25000 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a  late->rSetup );.
25010 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f  .    /* whereLoo
25020 70 41 64 64 42 74 72 65 65 28 29 20 61 6c 77 61  pAddBtree() alwa
25030 79 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64  ys generates and
25040 20 69 6e 73 65 72 74 73 20 74 68 65 20 61 75 74   inserts the aut
25050 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20  omatic index.   
25060 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20   ** case first. 
25070 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c   Hence compatibl
25080 65 20 63 61 6e 64 69 64 61 74 65 20 57 68 65 72  e candidate Wher
25090 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76  eLoops never hav
250a0 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a  e a larger.    *
250b0 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74  * rSetup. Call t
250c0 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49  his SETUP-INVARI
250d0 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ANT */.    asser
250e0 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  t( p->rSetup>=pT
250f0 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
25100 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c  );..    /* Any l
25110 6f 6f 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70  oop using an app
25120 6c 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20  liation-defined 
25130 69 6e 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52  index (or PRIMAR
25140 59 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20  Y KEY or.    ** 
25150 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
25160 74 29 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d  t) with one or m
25170 6f 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ore == constrain
25180 74 73 20 69 73 20 62 65 74 74 65 72 0a 20 20 20  ts is better.   
25190 20 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f   ** than an auto
251a0 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a  matic index. */.
251b0 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c      if( (p->wsFl
251c0 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
251d0 5f 49 4e 44 45 58 29 21 3d 30 0a 20 20 20 20 20  _INDEX)!=0.     
251e0 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77  && (pTemplate->w
251f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
25200 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
25210 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77  && (pTemplate->w
25220 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
25230 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a 20 20 20  OLUMN_EQ)!=0.   
25240 20 20 26 26 20 28 70 2d 3e 70 72 65 72 65 71 20    && (p->prereq 
25250 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
25260 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  req)==pTemplate-
25270 3e 70 72 65 72 65 71 0a 20 20 20 20 29 7b 0a 20  >prereq.    ){. 
25280 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25290 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 78 69  }..    /* If exi
252a0 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
252b0 70 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e  p is better than
252c0 20 70 54 65 6d 70 6c 61 74 65 2c 20 70 54 65 6d   pTemplate, pTem
252d0 70 6c 61 74 65 20 63 61 6e 20 62 65 0a 20 20 20  plate can be.   
252e0 20 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20   ** discarded.  
252f0 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62  WhereLoop p is b
25300 65 74 74 65 72 20 69 66 3a 0a 20 20 20 20 2a 2a  etter if:.    **
25310 20 20 20 28 31 29 20 20 70 20 68 61 73 20 6e 6f     (1)  p has no
25320 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 69   more dependenci
25330 65 73 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  es than pTemplat
25340 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20  e, and.    **   
25350 28 32 29 20 20 70 20 68 61 73 20 61 6e 20 65 71  (2)  p has an eq
25360 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ual or lower cos
25370 74 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  t than pTemplate
25380 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
25390 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65  (p->prereq & pTe
253a0 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d  mplate->prereq)=
253b0 3d 70 2d 3e 70 72 65 72 65 71 20 20 20 20 2f 2a  =p->prereq    /*
253c0 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26   (1)  */.     &&
253d0 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d   p->rSetup<=pTem
253e0 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 20 20  plate->rSetup   
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25400 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26  * (2a) */.     &
25410 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70  & p->rRun<=pTemp
25420 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20  late->rRun      
25430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25440 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 20  /* (2b) */.     
25450 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d  && p->nOut<=pTem
25460 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20  plate->nOut     
25470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25480 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20 20 20   /* (2c) */.    
25490 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
254a0 30 3b 20 20 2f 2a 20 44 69 73 63 61 72 64 20 70  0;  /* Discard p
254b0 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20  Template */.    
254c0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 65  }..    /* If pTe
254d0 6d 70 6c 61 74 65 20 69 73 20 61 6c 77 61 79 73  mplate is always
254e0 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 2c 20   better than p, 
254f0 74 68 65 6e 20 63 61 75 73 65 20 70 20 74 6f 20  then cause p to 
25500 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20  be overwritten. 
25510 20 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70     ** with pTemp
25520 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c 61 74 65  late.  pTemplate
25530 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20   is better than 
25540 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28  p if:.    **   (
25550 31 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61  1)  pTemplate ha
25560 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64  s no more depend
25570 65 6e 63 65 73 20 74 68 61 6e 20 70 2c 20 61 6e  ences than p, an
25580 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20  d.    **   (2)  
25590 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 61 6e  pTemplate has an
255a0 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20   equal or lower 
255b0 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20 20 20  cost than p..   
255c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   */.    if( (p->
255d0 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
255e0 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65  te->prereq)==pTe
255f0 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 20 20  mplate->prereq  
25600 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20   /* (1)  */.    
25610 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65   && p->rRun>=pTe
25620 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20  mplate->rRun    
25630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25640 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29           /* (2a)
25650 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e   */.     && p->n
25660 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Out>=pTemplate->
25670 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  nOut            
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25690 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20   /* (2b) */.    
256a0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
256b0 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
256c0 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
256d0 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41 52 49   /* SETUP-INVARI
256e0 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20  ANT above */.   
256f0 20 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a 20 43     break;   /* C
25700 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65  ause p to be ove
25710 72 77 72 69 74 74 65 6e 20 62 79 20 70 54 65 6d  rwritten by pTem
25720 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 20  plate */.    }. 
25730 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 70 50 72   }.  return ppPr
25740 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  ev;.}../*.** Ins
25750 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61  ert or replace a
25760 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
25770 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c   using the templ
25780 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a  ate supplied..**
25790 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20  .** An existing 
257a0 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20  WhereLoop entry 
257b0 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72 69  might be overwri
257c0 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20  tten if the new 
257d0 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62  template.** is b
257e0 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66 65  etter and has fe
257f0 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
25800 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61  .  Or the templa
25810 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  te will be ignor
25820 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73  ed.** and no ins
25830 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69  ert will occur i
25840 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  f an existing Wh
25850 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65  ereLoop is faste
25860 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77  r and has.** few
25870 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
25880 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  than the templat
25890 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 20  e.  Otherwise a 
258a0 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  new WhereLoop is
258b0 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64 20  .** added based 
258c0 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e  on the template.
258d0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64  .**.** If pBuild
258e0 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f  er->pOrSet is no
258f0 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 63  t NULL then we c
25900 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74  are about only t
25910 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69 73 69  he.** prerequisi
25920 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61 6e 64  tes and rRun and
25930 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66 20 74   nOut costs of t
25940 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e  he N best loops.
25950 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d    That.** inform
25960 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65 72 65  ation is gathere
25970 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c 64 65  d in the pBuilde
25980 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63 74  r->pOrSet object
25990 2e 20 20 54 68 69 73 20 73 70 65 63 69 61 6c 0a  .  This special.
259a0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f  ** processing mo
259b0 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  de is used only 
259c0 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72  for OR clause pr
259d0 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
259e0 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e  When accumulatin
259f0 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73  g multiple loops
25a00 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72 2d   (when pBuilder-
25a10 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c 29  >pOrSet is NULL)
25a20 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67   we.** still mig
25a30 68 74 20 6f 76 65 72 77 72 69 74 65 20 73 69 6d  ht overwrite sim
25a40 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68 20  ilar loops with 
25a50 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65  the new template
25a60 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 74   if the.** new t
25a70 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65  emplate is bette
25a80 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65  r.  Loops may be
25a90 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20   overwritten if 
25aa0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  the following .*
25ab0 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65  * conditions are
25ac0 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28   met:.**.**    (
25ad0 31 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68  1)  They have th
25ae0 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20  e same iTab..** 
25af0 20 20 20 28 32 29 20 20 54 68 65 79 20 68 61 76     (2)  They hav
25b00 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72 74  e the same iSort
25b10 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20  Idx..**    (3)  
25b20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
25b30 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20 64   same or fewer d
25b40 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e  ependencies than
25b50 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
25b60 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68 65  p.**    (4)  The
25b70 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74 68   template has th
25b80 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20  e same or lower 
25b90 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63 75  cost than the cu
25ba0 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74  rrent loop.*/.st
25bb0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
25bc0 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c 6f  opInsert(WhereLo
25bd0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
25be0 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  der, WhereLoop *
25bf0 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68  pTemplate){.  Wh
25c00 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76  ereLoop **ppPrev
25c10 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65 49 6e 66  , *p;.  WhereInf
25c20 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
25c30 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
25c40 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
25c50 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
25c60 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c  ;..  /* If pBuil
25c70 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64  der->pOrSet is d
25c80 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c  efined, then onl
25c90 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  y keep track of 
25ca0 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61  the costs.  ** a
25cb0 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f  nd prereqs..  */
25cc0 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d  .  if( pBuilder-
25cd0 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23 69  >pOrSet!=0 ){.#i
25ce0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
25cf0 42 4c 45 44 0a 20 20 20 20 75 31 36 20 6e 20 3d  BLED.    u16 n =
25d00 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
25d10 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20  t->n;.    int x 
25d20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68 65  =.#endif.    whe
25d30 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c  reOrInsert(pBuil
25d40 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65  der->pOrSet, pTe
25d50 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20  mplate->prereq, 
25d60 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
25d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d90 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
25da0 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45  nOut);.#if WHERE
25db0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
25dc0 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20   0x8 */.    if( 
25dd0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
25de0 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20  e & 0x8 ){.     
25df0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25e00 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a  ntf(x?"   or-%d:
25e10 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22    ":"   or-X:  "
25e20 2c 20 6e 29 3b 0a 20 20 20 20 20 20 77 68 65 72  , n);.      wher
25e30 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
25e40 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
25e50 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pWC);.    }.#end
25e60 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
25e70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
25e80 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65  /* Look for an e
25e90 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
25ea0 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77 69 74  p to replace wit
25eb0 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2f  h pTemplate.  */
25ec0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75  .  whereLoopAdju
25ed0 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e 70  stCost(pWInfo->p
25ee0 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65  Loops, pTemplate
25ef0 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20 77 68  );.  ppPrev = wh
25f00 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65  ereLoopFindLesse
25f10 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  r(&pWInfo->pLoop
25f20 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 0a  s, pTemplate);..
25f30 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d 30 20    if( ppPrev==0 
25f40 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
25f50 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
25f60 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74 68   WhereLoop on th
25f70 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 62  e list that is b
25f80 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  etter.    ** tha
25f90 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f 20  n pTemplate, so 
25fa0 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54 65 6d  just ignore pTem
25fb0 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57 48 45  plate */.#if WHE
25fc0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
25fd0 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66  /* 0x8 */.    if
25fe0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
25ff0 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
26000 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
26010 72 69 6e 74 66 28 22 69 6e 73 2d 6e 6f 6f 70 3a  rintf("ins-noop:
26020 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   ");.      where
26030 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
26040 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
26050 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  WC);.    }.#endi
26060 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
26070 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73  ITE_OK;  .  }els
26080 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50 72  e{.    p = *ppPr
26090 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ev;.  }..  /* If
260a0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
260b0 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68  oint it means th
260c0 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68  at either p[] sh
260d0 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74  ould be overwrit
260e0 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54  ten.  ** with pT
260f0 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d  emplate[] if p[]
26100 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70   exists, or if p
26110 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f  ==NULL then allo
26120 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20  cate a new.  ** 
26130 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e  WhereLoop and in
26140 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  sert it..  */.#i
26150 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
26160 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
26170 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
26180 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
26190 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a      if( p!=0 ){.
261a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
261b0 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 64 65  ugPrintf("ins-de
261c0 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20 20 77 68  l:  ");.      wh
261d0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
261e0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
261f0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
26200 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e  3DebugPrintf("in
26210 73 2d 6e 65 77 3a 20 20 22 29 3b 0a 20 20 20 20  s-new:  ");.    
26220 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
26230 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
26240 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65  er->pWC);.  }.#e
26250 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20  ndif.  if( p==0 
26260 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  ){.    /* Alloca
26270 74 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f  te a new WhereLo
26280 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65  op to add to the
26290 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74   end of the list
262a0 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20   */.    *ppPrev 
262b0 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  = p = sqlite3DbM
262c0 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
262d0 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b  eof(WhereLoop));
262e0 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
262f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
26300 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  MEM;.    whereLo
26310 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70  opInit(p);.    p
26320 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b  ->pNextLoop = 0;
26330 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
26340 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72   We will be over
26350 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  writing WhereLoo
26360 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f  p p[].  But befo
26370 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a  re we do, first.
26380 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67      ** go throug
26390 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  h the rest of th
263a0 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74  e list and delet
263b0 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72  e any other entr
263c0 69 65 73 20 62 65 73 69 64 65 73 0a 20 20 20 20  ies besides.    
263d0 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20  ** p[] that are 
263e0 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62  also supplated b
263f0 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  y pTemplate */. 
26400 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70     WhereLoop **p
26410 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78  pTail = &p->pNex
26420 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65  tLoop;.    Where
26430 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20  Loop *pToDel;.  
26440 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c    while( *ppTail
26450 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c   ){.      ppTail
26460 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64   = whereLoopFind
26470 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70  Lesser(ppTail, p
26480 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20  Template);.     
26490 20 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20 29   if( ppTail==0 )
264a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54   break;.      pT
264b0 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b 0a  oDel = *ppTail;.
264c0 20 20 20 20 20 20 69 66 28 20 70 54 6f 44 65 6c        if( pToDel
264d0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
264e0 20 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54 6f     *ppTail = pTo
264f0 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  Del->pNextLoop;.
26500 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
26510 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
26520 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
26530 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
26540 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  x8 ){.        sq
26550 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26560 28 22 69 6e 73 2d 64 65 6c 3a 20 20 22 29 3b 0a  ("ins-del:  ");.
26570 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
26580 70 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70  pPrint(pToDel, p
26590 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
265a0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
265b0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c      whereLoopDel
265c0 65 74 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b  ete(db, pToDel);
265d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 65  .    }.  }.  whe
265e0 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70  reLoopXfer(db, p
265f0 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20  , pTemplate);.  
26600 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
26610 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
26620 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
26630 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
26640 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
26650 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  x;.    if( pInde
26660 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75  x && pIndex->tnu
26670 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  m==0 ){.      p-
26680 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
26690 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
266a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
266b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  K;.}../*.** Adju
266c0 73 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  st the WhereLoop
266d0 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e  .nOut value down
266e0 77 61 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20  ward to account 
266f0 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
26700 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
26710 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
26720 74 68 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69  the loop but whi
26730 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ch are not used 
26740 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a  by an.** index..
26750 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 75 72  **.** In the cur
26760 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
26770 69 6f 6e 2c 20 74 68 65 20 66 69 72 73 74 20 65  ion, the first e
26780 78 74 72 61 20 57 48 45 52 45 20 63 6c 61 75 73  xtra WHERE claus
26790 65 20 74 65 72 6d 20 72 65 64 75 63 65 73 0a 2a  e term reduces.*
267a0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
267b0 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79 20 61  output rows by a
267c0 20 66 61 63 74 6f 72 20 6f 66 20 31 30 20 61 6e   factor of 10 an
267d0 64 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61  d each additiona
267e0 6c 20 74 65 72 6d 0a 2a 2a 20 72 65 64 75 63 65  l term.** reduce
267f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
26800 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79 20 73  output rows by s
26810 71 72 74 28 32 29 2e 0a 2a 2f 0a 73 74 61 74 69  qrt(2)..*/.stati
26820 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
26830 4f 75 74 70 75 74 41 64 6a 75 73 74 28 0a 20 20  OutputAdjust(.  
26840 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
26850 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  ,      /* The WH
26860 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
26870 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
26880 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f  ,      /* The lo
26890 6f 70 20 74 6f 20 61 64 6a 75 73 74 20 64 6f 77  op to adjust dow
268a0 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73  nward */.  LogEs
268b0 74 20 6e 52 6f 77 20 20 20 20 20 20 20 20 20 20  t nRow          
268c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
268d0 6f 77 73 20 69 6e 20 74 68 65 20 65 6e 74 69 72  ows in the entir
268e0 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
268f0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
26900 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b  , *pX;.  Bitmask
26910 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28   notAllowed = ~(
26920 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c  pLoop->prereq|pL
26930 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a  oop->maskSelf);.
26940 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
26950 74 20 6e 45 71 20 3d 20 30 3b 20 20 20 20 2f 2a  t nEq = 0;    /*
26960 20 4e 75 6d 62 65 72 20 6f 66 20 3d 20 63 6f 6e   Number of = con
26970 73 74 72 61 69 6e 74 73 20 6e 6f 74 20 77 69 74  straints not wit
26980 68 69 6e 20 6c 69 6b 65 6c 79 28 29 2f 75 6e 6c  hin likely()/unl
26990 69 6b 65 6c 79 28 29 20 2a 2f 0a 0a 20 20 66 6f  ikely() */..  fo
269a0 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20  r(i=pWC->nTerm, 
269b0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e  pTerm=pWC->a; i>
269c0 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; i--, pTerm++)
269d0 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
269e0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
269f0 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62  _VIRTUAL)!=0 ) b
26a00 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70  reak;.    if( (p
26a10 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
26a20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
26a30 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  f)==0 ) continue
26a40 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
26a50 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
26a60 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63  tAllowed)!=0 ) c
26a70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
26a80 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d  (j=pLoop->nLTerm
26a90 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
26aa0 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70        pX = pLoop
26ab0 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
26ac0 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63     if( pX==0 ) c
26ad0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
26ae0 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62  f( pX==pTerm ) b
26af0 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
26b00 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26  pX->iParent>=0 &
26b10 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69  & (&pWC->a[pX->i
26b20 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20  Parent])==pTerm 
26b30 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
26b40 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20     if( j<0 ){.  
26b50 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
26b60 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20  ruthProb<=0 ){. 
26b70 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
26b80 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  ut += pTerm->tru
26b90 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 7d 65  thProb;.      }e
26ba0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  lse{.        pLo
26bb0 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20  op->nOut--;.    
26bc0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
26bd0 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 20 29  Operator&WO_EQ )
26be0 20 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a   nEq++;.      }.
26bf0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 54      }.  }.  /* T
26c00 55 4e 49 4e 47 3a 20 20 49 66 20 74 68 65 72 65  UNING:  If there
26c10 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   is at least one
26c20 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
26c30 61 69 6e 74 20 69 6e 20 74 68 65 20 57 48 45 52  aint in the WHER
26c40 45 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 74 68  E.  ** clause th
26c50 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  at does not have
26c60 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20   a likelihood() 
26c70 65 78 70 6c 69 63 69 74 6c 79 20 61 73 73 69 67  explicitly assig
26c80 6e 65 64 20 74 6f 20 69 74 0a 20 20 2a 2a 20 74  ned to it.  ** t
26c90 68 65 6e 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74  hen do not let t
26ca0 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
26cb0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
26cc0 77 73 20 65 78 63 65 65 64 20 68 61 6c 66 20 0a  ws exceed half .
26cd0 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
26ce0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
26cf0 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  able. */.  if( n
26d00 45 71 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  Eq && pLoop->nOu
26d10 74 3e 6e 52 6f 77 2d 31 30 20 29 7b 0a 20 20 20  t>nRow-10 ){.   
26d20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e   pLoop->nOut = n
26d30 52 6f 77 20 2d 20 31 30 3b 0a 20 20 7d 0a 7d 0a  Row - 10;.  }.}.
26d40 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
26d50 65 20 63 6f 73 74 20 43 20 62 79 20 74 68 65 20  e cost C by the 
26d60 63 6f 73 74 4d 75 6c 74 20 66 61 63 74 65 72 20  costMult facter 
26d70 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63  T.  This only oc
26d80 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  curs if.** compi
26d90 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c 49 54  led with -DSQLIT
26da0 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c  E_ENABLE_COSTMUL
26db0 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  T.*/.#ifdef SQLI
26dc0 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55  TE_ENABLE_COSTMU
26dd0 4c 54 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c  LT.# define Appl
26de0 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
26df0 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c  C,T)  C += T.#el
26e00 73 65 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c  se.# define Appl
26e10 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
26e20 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  C,T).#endif../*.
26e30 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66 61  ** We have so fa
26e40 72 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64  r matched pBuild
26e50 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
26e60 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74  e.nEq terms of t
26e70 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e  he .** index pIn
26e80 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74 63  dex. Try to matc
26e90 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a  h one more..**.*
26ea0 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
26eb0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
26ec0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
26ed0 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  nOut contains th
26ee0 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  e .** number of 
26ef0 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f  rows expected to
26f00 20 62 65 20 76 69 73 69 74 65 64 20 62 79 20 66   be visited by f
26f10 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20 74  iltering using t
26f20 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73  he nEq .** terms
26f30 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73 20   only. If it is 
26f40 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20 76  modified, this v
26f50 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65 64  alue is restored
26f60 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a   before this .**
26f70 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
26f80 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f  s..**.** If pPro
26f90 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61  be->tnum==0, tha
26fa0 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69  t means pIndex i
26fb0 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75  s a fake index u
26fc0 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49  sed for the.** I
26fd0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
26fe0 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EY..*/.static in
26ff0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
27000 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  reeIndex(.  Wher
27010 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
27020 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54  uilder,     /* T
27030 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63  he WhereLoop fac
27040 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  tory */.  struct
27050 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
27060 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  Src,      /* FRO
27070 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
27080 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
27090 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c    Index *pProbe,
270a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270b0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
270c0 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73   pSrc */.  LogEs
270d0 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20  t nInMul        
270e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
270f0 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  g(Number of iter
27100 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e  ations due to IN
27110 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  ) */.){.  WhereI
27120 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
27130 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20  uilder->pWInfo; 
27140 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
27150 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  e context */.  P
27160 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
27170 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
27180 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
27190 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
271a0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
271b0 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a  se->db;       /*
271c0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
271d0 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74  tion malloc cont
271e0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
271f0 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
27200 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
27210 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75  late WhereLoop u
27220 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
27230 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
27240 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
27250 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72         /* A Wher
27260 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73  eTerm under cons
27270 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  ideration */.  i
27280 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20  nt opMask;      
27290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
272a0 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72  * Valid operator
272b0 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  s for constraint
272c0 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e  s */.  WhereScan
272d0 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20   scan;          
272e0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
272f0 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72  or for WHERE ter
27300 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
27310 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20  saved_prereq;   
27320 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
27330 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
27340 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75  w->prereq */.  u
27350 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b  16 saved_nLTerm;
27360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27370 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
27380 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d   of pNew->nLTerm
27390 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
273a0 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
273b0 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
273c0 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
273d0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a  >u.btree.nEq */.
273e0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69    u16 saved_nSki
273f0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
27400 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
27410 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62  lue of pNew->u.b
27420 74 72 65 65 2e 6e 53 6b 69 70 20 2a 2f 0a 20 20  tree.nSkip */.  
27430 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67  u32 saved_wsFlag
27440 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
27450 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
27460 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61  e of pNew->wsFla
27470 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73  gs */.  LogEst s
27480 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20  aved_nOut;      
27490 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
274a0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
274b0 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74  w->nOut */.  int
274c0 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
274d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
274e0 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  Index of the col
274f0 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
27500 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
27510 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
27520 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
27530 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  code */.  LogEst
27540 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   rSize;         
27550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
27560 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
27570 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f  he table */.  Lo
27580 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20  gEst rLogSize;  
27590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
275a0 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61   Logarithm of ta
275b0 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68  ble size */.  Wh
275c0 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20  ereTerm *pTop = 
275d0 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a  0, *pBtm = 0; /*
275e0 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20   Top and bottom 
275f0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
27600 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70  s */..  pNew = p
27610 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
27620 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
27630 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
27640 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20  QLITE_NOMEM;..  
27650 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
27660 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
27670 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
27680 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e  );.  assert( (pN
27690 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
276a0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d  ERE_TOP_LIMIT)==
276b0 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  0 );.  if( pNew-
276c0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
276d0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
276e0 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54    opMask = WO_LT
276f0 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20  |WO_LE;.  }else 
27700 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  if( pProbe->tnum
27710 3c 3d 30 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f  <=0 || (pSrc->jo
27720 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
27730 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61  )!=0 ){.    opMa
27740 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
27750 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
27760 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73  LT|WO_LE;.  }els
27770 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  e{.    opMask = 
27780 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49  WO_EQ|WO_IN|WO_I
27790 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47  SNULL|WO_GT|WO_G
277a0 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  E|WO_LT|WO_LE;. 
277b0 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d   }.  if( pProbe-
277c0 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70  >bUnordered ) op
277d0 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c  Mask &= ~(WO_GT|
277e0 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_GE|WO_LT|WO_L
277f0 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  E);..  assert( p
27800 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
27810 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
27820 20 29 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 50 72   );.  iCol = pPr
27830 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e  obe->aiColumn[pN
27840 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d  ew->u.btree.nEq]
27850 3b 0a 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65  ;..  pTerm = whe
27860 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
27870 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c  , pBuilder->pWC,
27880 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20   pSrc->iCursor, 
27890 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  iCol,.          
278a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
278b0 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20  Mask, pProbe);. 
278c0 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65   saved_nEq = pNe
278d0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
278e0 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20    saved_nSkip = 
278f0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53  pNew->u.btree.nS
27900 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54  kip;.  saved_nLT
27910 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65  erm = pNew->nLTe
27920 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73 46 6c  rm;.  saved_wsFl
27930 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c  ags = pNew->wsFl
27940 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70 72 65  ags;.  saved_pre
27950 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72  req = pNew->prer
27960 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74  eq;.  saved_nOut
27970 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20   = pNew->nOut;. 
27980 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
27990 30 3b 0a 20 20 72 53 69 7a 65 20 3d 20 70 50 72  0;.  rSize = pPr
279a0 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
279b0 5b 30 5d 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20  [0];.  rLogSize 
279c0 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b  = estLog(rSize);
279d0 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20  ..  /* Consider 
279e0 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73 63 61  using a skip-sca
279f0 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
27a00 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  o WHERE clause c
27a10 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
27a20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68  available for th
27a30 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  e left-most term
27a40 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20  s of the index, 
27a50 61 6e 64 20 69 66 20 74 68 65 20 61 76 65 72 61  and if the avera
27a60 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  ge.  ** number o
27a70 66 20 72 65 70 65 61 74 73 20 69 6e 20 74 68 65  f repeats in the
27a80 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73   left-most terms
27a90 20 69 73 20 61 74 20 6c 65 61 73 74 20 31 38 2e   is at least 18.
27aa0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
27ab0 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31 38 20  magic number 18 
27ac0 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e 20 74  is selected on t
27ad0 68 65 20 62 61 73 69 73 20 74 68 61 74 20 73 63  he basis that sc
27ae0 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a 20  anning 17 rows. 
27af0 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c   ** is almost al
27b00 77 61 79 73 20 71 75 69 63 6b 65 72 20 74 68 61  ways quicker tha
27b10 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65 6b 20  n an index seek 
27b20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 66 20  (even though if 
27b30 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63  the index.  ** c
27b40 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74 68  ontains fewer th
27b50 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77 65 20  an 2^17 rows we 
27b60 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69 73 65  assume otherwise
27b70 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74 73 20   in other parts 
27b80 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65  of.  ** the code
27b90 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69 66 20  ). And, even if 
27ba0 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 73 68  it is not, it sh
27bb0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f 20  ould not be too 
27bc0 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20 20  much slower. .  
27bd0 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
27be0 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72 61 20  hand, the extra 
27bf0 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64 20  seeks could end 
27c00 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69 66 69  up being signifi
27c10 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65  cantly.  ** more
27c20 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f 0a   expensive.  */.
27c30 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d 73 71    assert( 42==sq
27c40 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38 29 20  lite3LogEst(18) 
27c50 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64 5f 6e  );.  if( saved_n
27c60 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a  Eq==saved_nSkip.
27c70 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b     && saved_nEq+
27c80 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  1<pProbe->nKeyCo
27c90 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  l.   && pProbe->
27ca0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
27cb0 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a  d_nEq+1]>=42  /*
27cc0 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d   TUNING: Minimum
27cd0 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a   for skip-scan *
27ce0 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77 68  /.   && (rc = wh
27cf0 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
27d00 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
27d10 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45  Term+1))==SQLITE
27d20 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67  _OK.  ){.    Log
27d30 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70  Est nIter;.    p
27d40 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
27d50 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ++;.    pNew->u.
27d60 62 74 72 65 65 2e 6e 53 6b 69 70 2b 2b 3b 0a 20  btree.nSkip++;. 
27d70 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
27d80 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
27d90 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  = 0;.    pNew->w
27da0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
27db0 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49  SKIPSCAN;.    nI
27dc0 74 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ter = pProbe->ai
27dd0 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
27de0 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61  nEq] - pProbe->a
27df0 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
27e00 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 69 66 28  _nEq+1];.    if(
27e10 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20   pTerm ){.      
27e20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 57 68 65 6e  /* TUNING:  When
27e30 20 65 73 74 69 6d 61 74 69 6e 67 20 73 6b 69 70   estimating skip
27e40 2d 73 63 61 6e 20 66 6f 72 20 61 20 74 65 72 6d  -scan for a term
27e50 20 74 68 61 74 20 69 73 20 61 6c 73 6f 20 69 6e   that is also in
27e60 64 65 78 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a  dexable,.      *
27e70 2a 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 63  * increase the c
27e80 6f 73 74 20 6f 66 20 74 68 65 20 73 6b 69 70 2d  ost of the skip-
27e90 73 63 61 6e 20 62 79 20 32 78 2c 20 74 6f 20 6d  scan by 2x, to m
27ea0 61 6b 65 20 69 74 20 61 20 6c 69 74 74 6c 65 20  ake it a little 
27eb0 6c 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  less.      ** de
27ec0 73 69 72 61 62 6c 65 20 74 68 61 6e 20 74 68 65  sirable than the
27ed0 20 72 65 67 75 6c 61 72 20 69 6e 64 65 78 20 6c   regular index l
27ee0 6f 6f 6b 75 70 2e 20 2a 2f 0a 20 20 20 20 20 20  ookup. */.      
27ef0 6e 49 74 65 72 20 2b 3d 20 31 30 3b 20 20 61 73  nIter += 10;  as
27f00 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65  sert( 10==sqlite
27f10 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20  3LogEst(2) );.  
27f20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f    }.    pNew->nO
27f30 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20 20  ut -= nIter;.   
27f40 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
27f50 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72  eeIndex(pBuilder
27f60 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20  , pSrc, pProbe, 
27f70 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c 29 3b  nIter + nInMul);
27f80 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
27f90 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20  = saved_nOut;.  
27fa0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
27fb0 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
27fc0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
27fd0 65 65 2e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64  ee.nSkip = saved
27fe0 5f 6e 53 6b 69 70 3b 0a 20 20 7d 0a 20 20 66 6f  _nSkip;.  }.  fo
27ff0 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
28000 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70  K && pTerm!=0; p
28010 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
28020 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20  Next(&scan)){.  
28030 20 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72    u16 eOp = pTer
28040 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20  m->eOperator;   
28050 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72  /* Shorthand for
28060 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
28070 72 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20  r */.    LogEst 
28080 72 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f  rCostIdx;.    Lo
28090 67 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73  gEst nOutUnadjus
280a0 74 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e  ted;        /* n
280b0 4f 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20  Out before IN() 
280c0 61 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73 74  and WHERE adjust
280d0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ments */.    int
280e0 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66   nIn = 0;.#ifdef
280f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
28100 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
28110 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20    int nRecValid 
28120 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  = pBuilder->nRec
28130 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20  Valid;.#endif.  
28140 20 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49    if( (eOp==WO_I
28150 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d  SNULL || (pTerm-
28160 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e  >wtFlags&TERM_VN
28170 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26  ULL)!=0).     &&
28180 20 28 69 43 6f 6c 3c 30 20 7c 7c 20 70 53 72 63   (iCol<0 || pSrc
28190 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ->pTab->aCol[iCo
281a0 6c 5d 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20 20 20  l].notNull).    
281b0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
281c0 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20  e; /* ignore IS 
281d0 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74  [NOT] NULL const
281e0 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55  raints on NOT NU
281f0 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  LL columns */.  
28200 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72    }.    if( pTer
28210 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
28220 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
28230 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
28240 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
28250 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
28260 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
28270 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45  e.nEq = saved_nE
28280 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  q;.    pNew->nLT
28290 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65  erm = saved_nLTe
282a0 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72  rm;.    if( wher
282b0 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
282c0 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
282d0 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f  rm+1) ) break; /
282e0 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65  * OOM */.    pNe
282f0 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
28300 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72  nLTerm++] = pTer
28310 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  m;.    pNew->pre
28320 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65  req = (saved_pre
28330 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65  req | pTerm->pre
28340 72 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65  reqRight) & ~pNe
28350 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20 20  w->maskSelf;..  
28360 20 20 61 73 73 65 72 74 28 20 6e 49 6e 4d 75 6c    assert( nInMul
28370 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c 20 28  ==0.        || (
28380 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
28390 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
283a0 4c 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c  L)!=0 .        |
283b0 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  | (pNew->wsFlags
283c0 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
283d0 49 4e 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  IN)!=0 .        
283e0 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  || (pNew->wsFlag
283f0 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43  s & WHERE_SKIPSC
28400 41 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a 0a  AN)!=0 .    );..
28410 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f      if( eOp & WO
28420 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70  _IN ){.      Exp
28430 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
28440 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70  ->pExpr;.      p
28450 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
28460 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b  WHERE_COLUMN_IN;
28470 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
28480 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
28490 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
284a0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78  ){.        /* "x
284b0 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
284c0 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20  ":  TUNING: the 
284d0 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32  SELECT returns 2
284e0 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  5 rows */.      
284f0 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73    nIn = 46;  ass
28500 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33  ert( 46==sqlite3
28510 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 20 20  LogEst(25) );.  
28520 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
28530 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
28540 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ist && pExpr->x.
28550 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  pList->nExpr) ){
28560 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
28570 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c  N (value, value,
28580 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20   ...)" */.      
28590 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c    nIn = sqlite3L
285a0 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e 70  ogEst(pExpr->x.p
285b0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
285c0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
285d0 72 74 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a  rt( nIn>0 );  /*
285e0 20 52 48 53 20 61 6c 77 61 79 73 20 68 61 73 20   RHS always has 
285f0 32 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 2e  2 or more terms.
28600 2e 2e 20 20 54 68 65 20 70 61 72 73 65 72 0a 20  ..  The parser. 
28610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28620 20 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65         ** change
28630 73 20 22 78 20 49 4e 20 28 3f 29 22 20 69 6e 74  s "x IN (?)" int
28640 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a 0a 20 20 20  o "x=?". */..   
28650 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26   }else if( eOp &
28660 20 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20   (WO_EQ) ){.    
28670 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
28680 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
28690 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  EQ;.      if( iC
286a0 6f 6c 3c 30 20 7c 7c 20 28 6e 49 6e 4d 75 6c 3d  ol<0 || (nInMul=
286b0 3d 30 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74  =0 && pNew->u.bt
286c0 72 65 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d  ree.nEq==pProbe-
286d0 3e 6e 4b 65 79 43 6f 6c 2d 31 29 20 29 7b 0a 20  >nKeyCol-1) ){. 
286e0 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
286f0 3d 30 20 26 26 20 21 49 73 55 6e 69 71 75 65 49  =0 && !IsUniqueI
28700 6e 64 65 78 28 70 50 72 6f 62 65 29 20 29 7b 0a  ndex(pProbe) ){.
28710 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
28720 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
28730 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20  _UNQ_WANTED;.   
28740 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28750 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
28760 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45  ags |= WHERE_ONE
28770 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROW;.        }. 
28780 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
28790 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53   if( eOp & WO_IS
287a0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e  NULL ){.      pN
287b0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
287c0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
287d0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
287e0 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  eOp & (WO_GT|WO_
287f0 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  GE) ){.      tes
28800 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
28810 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
28820 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47  case( eOp & WO_G
28830 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E );.      pNew-
28840 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
28850 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
28860 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
28870 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65        pBtm = pTe
28880 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d  rm;.      pTop =
28890 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
288a0 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70       assert( eOp
288b0 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
288c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
288d0 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20  se( eOp & WO_LT 
288e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
288f0 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29  e( eOp & WO_LE )
28900 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
28910 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
28920 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
28930 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
28940 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b     pTop = pTerm;
28950 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70  .      pBtm = (p
28960 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
28970 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21  HERE_BTM_LIMIT)!
28980 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  =0 ?.           
28990 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
289a0 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
289b0 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20  erm-2] : 0;.    
289c0 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
289d0 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f  s point pNew->nO
289e0 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ut is set to the
289f0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
28a00 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20 20 20  expected to.    
28a10 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20 62 79  ** be visited by
28a20 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20   the index scan 
28a30 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65 72 69  before consideri
28a40 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f  ng term pTerm, o
28a50 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c  r the.    ** val
28a60 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e  ues of nIn and n
28a70 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20  InMul. In other 
28a80 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e 67 20  words, assuming 
28a90 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a  that all .    **
28aa0 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72   "x IN(...)" ter
28ab0 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65 64 20  ms are replaced 
28ac0 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20 54 68  with "x = ?". Th
28ad0 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  is block updates
28ae0 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
28af0 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
28b00 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 70  to account for p
28b10 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49  Term (but not nI
28b20 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20  n/nInMul).  */. 
28b30 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
28b40 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
28b50 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  t );.    if( pNe
28b60 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
28b70 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
28b80 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
28b90 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20 73 74  st nOut using st
28ba0 61 74 33 2f 73 74 61 74 34 20 64 61 74 61 2e 20  at3/stat4 data. 
28bb0 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  Or, if there is 
28bc0 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34 0a 20  no stat3/stat4. 
28bd0 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20 75 73       ** data, us
28be0 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  ing some other e
28bf0 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20  stimate.  */.   
28c00 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61     whereRangeSca
28c10 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
28c20 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f  ilder, pBtm, pTo
28c30 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65  p, pNew);.    }e
28c40 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
28c50 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62  Eq = ++pNew->u.b
28c60 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20  tree.nEq;.      
28c70 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57  assert( eOp & (W
28c80 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57  O_ISNULL|WO_EQ|W
28c90 4f 5f 49 4e 29 20 29 3b 0a 0a 20 20 20 20 20 20  O_IN) );..      
28ca0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
28cb0 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
28cc0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
28cd0 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20  m->truthProb<=0 
28ce0 26 26 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  && iCol>=0 ){.  
28cf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 65        assert( (e
28d00 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e  Op & WO_IN) || n
28d10 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  In==0 );.       
28d20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
28d30 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20   WO_IN );.      
28d40 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
28d50 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
28d60 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
28d70 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20  nOut -= nIn;.   
28d80 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66     }else{.#ifdef
28d90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
28da0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
28db0 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f        tRowcnt nO
28dc0 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
28dd0 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20  if( nInMul==0 . 
28de0 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62          && pProb
28df0 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20  e->nSample .    
28e00 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e       && pNew->u.
28e10 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62  btree.nEq<=pProb
28e20 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20  e->nSampleCol.  
28e30 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69         && Optimi
28e40 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
28e50 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29 20  , SQLITE_Stat3) 
28e60 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 65  .         && ((e
28e70 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c  Op & WO_IN)==0 |
28e80 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  | !ExprHasProper
28e90 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
28ea0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a   EP_xIsSelect)).
28eb0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
28ec0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
28ed0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
28ee0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
28ef0 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  eOp & (WO_EQ|WO_
28f00 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20  ISNULL))!=0 ){. 
28f10 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
28f20 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51  ase( eOp & WO_EQ
28f30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
28f40 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
28f50 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
28f60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
28f70 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
28f80 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
28f90 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
28fa0 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20   &nOut);.       
28fb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28fc0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
28fd0 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  InScanEst(pParse
28fe0 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70  , pBuilder, pExp
28ff0 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75  r->x.pList, &nOu
29000 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
29010 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
29020 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
29030 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  D ) rc = SQLITE_
29040 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  OK;.          if
29050 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29060 29 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20 20  ) break;        
29070 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66    /* Jump out of
29080 20 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20   the pTerm loop 
29090 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
290a0 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20   nOut ){.       
290b0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
290c0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
290d0 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  nOut);.         
290e0 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75     if( pNew->nOu
290f0 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20 70  t>saved_nOut ) p
29100 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
29110 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  d_nOut;.        
29120 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d      pNew->nOut -
29130 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20 20  = nIn;.         
29140 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
29150 20 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30       if( nOut==0
29160 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   ).#endif.      
29170 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e    {.          pN
29180 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72  ew->nOut += (pPr
29190 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
291a0 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e  [nEq] - pProbe->
291b0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d  aiRowLogEst[nEq-
291c0 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  1]);.          i
291d0 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55  f( eOp & WO_ISNU
291e0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
291f0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20    /* TUNING: If 
29200 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65  there is no like
29210 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20  lihood() value, 
29220 61 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a 20  assume that a . 
29230 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22 63             ** "c
29240 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70 72  ol IS NULL" expr
29250 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74  ession matches t
29260 77 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f 77  wice as many row
29270 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s .            *
29280 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f  * as (col=?). */
29290 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
292a0 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20  w->nOut += 10;. 
292b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
292c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
292d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72   }..    /* Set r
292e0 43 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20 63  CostIdx to the c
292f0 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20  ost of visiting 
29300 73 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69 6e  selected rows in
29310 20 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20 20   index. Add.    
29320 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72  ** it to pNew->r
29330 52 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63 75  Run, which is cu
29340 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74  rrently set to t
29350 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 69  he cost of the i
29360 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b  ndex.    ** seek
29370 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20   only. Then, if 
29380 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f  this is a non-co
29390 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61 64  vering index, ad
293a0 64 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20  d the cost of.  
293b0 20 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74 68    ** visiting th
293c0 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61  e rows in the ma
293d0 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  in table.  */.  
293e0 20 20 72 43 6f 73 74 49 64 78 20 3d 20 70 4e 65    rCostIdx = pNe
293f0 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31  w->nOut + 1 + (1
29400 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52  5*pProbe->szIdxR
29410 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e  ow)/pSrc->pTab->
29420 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e  szTabRow;.    pN
29430 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
29440 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67  e3LogEstAdd(rLog
29450 53 69 7a 65 2c 20 72 43 6f 73 74 49 64 78 29 3b  Size, rCostIdx);
29460 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e  .    if( (pNew->
29470 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
29480 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f  _IDX_ONLY|WHERE_
29490 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  IPK))==0 ){.    
294a0 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
294b0 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
294c0 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77  pNew->rRun, pNew
294d0 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20  ->nOut + 16);.  
294e0 20 20 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f 73    }.    ApplyCos
294f0 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77  tMultiplier(pNew
29500 2d 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d 3e  ->rRun, pProbe->
29510 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74  pTable->costMult
29520 29 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64  );..    nOutUnad
29530 6a 75 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e  justed = pNew->n
29540 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72  Out;.    pNew->r
29550 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20  Run += nInMul + 
29560 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nIn;.    pNew->n
29570 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20  Out += nInMul + 
29580 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  nIn;.    whereLo
29590 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70  opOutputAdjust(p
295a0 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e  Builder->pWC, pN
295b0 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
295c0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
295d0 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
295e0 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  New);..    if( p
295f0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
29600 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
29610 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E ){.      pNew-
29620 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
29630 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ut;.    }else{. 
29640 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
29650 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64  = nOutUnadjusted
29660 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
29670 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
29680 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
29690 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e  T)==0.     && pN
296a0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
296b0 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a  pProbe->nColumn.
296c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65      ){.      whe
296d0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
296e0 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53  dex(pBuilder, pS
296f0 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d  rc, pProbe, nInM
29700 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20  ul+nIn);.    }. 
29710 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
29720 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64  saved_nOut;.#ifd
29730 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
29740 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
29750 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
29760 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61  ecValid = nRecVa
29770 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  lid;.#endif.  }.
29780 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
29790 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20   saved_prereq;. 
297a0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
297b0 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
297c0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
297d0 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53  nSkip = saved_nS
297e0 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46  kip;.  pNew->wsF
297f0 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
29800 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f  lags;.  pNew->nO
29810 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
29820 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
29830 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a  = saved_nLTerm;.
29840 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29850 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75  /*.** Return Tru
29860 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
29870 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20  ble that pIndex 
29880 6d 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20  might be useful 
29890 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69  in.** implementi
298a0 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ng the ORDER BY 
298b0 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64  clause in pBuild
298c0 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
298d0 20 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64   False if pBuild
298e0 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  er does not cont
298f0 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ain an ORDER BY 
29900 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20  clause or.** if 
29910 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
29920 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65  for pIndex to be
29930 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65   useful in imple
29940 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20  menting that.** 
29950 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
29960 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
29970 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
29980 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72  hOrderBy(.  Wher
29990 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
299a0 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20  uilder,.  Index 
299b0 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69  *pIndex,.  int i
299c0 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72  Cursor.){.  Expr
299d0 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e 74  List *pOB;.  int
299e0 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20   ii, jj;..  if( 
299f0 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
29a00 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
29a10 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69   if( (pOB = pBui
29a20 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f  lder->pWInfo->pO
29a30 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74  rderBy)==0 ) ret
29a40 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d  urn 0;.  for(ii=
29a50 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72  0; ii<pOB->nExpr
29a60 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  ; ii++){.    Exp
29a70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74  r *pExpr = sqlit
29a80 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
29a90 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78  e(pOB->a[ii].pEx
29aa0 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  pr);.    if( pEx
29ab0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
29ac0 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
29ad0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
29ae0 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a  ble==iCursor ){.
29af0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
29b00 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  >iColumn<0 ) ret
29b10 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  urn 1;.      for
29b20 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78  (jj=0; jj<pIndex
29b30 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29  ->nKeyCol; jj++)
29b40 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  {.        if( pE
29b50 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  xpr->iColumn==pI
29b60 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  ndex->aiColumn[j
29b70 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  j] ) return 1;. 
29b80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
29b90 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
29ba0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62  /*.** Return a b
29bb0 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20  itmask where 1s 
29bc0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
29bd0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
29be0 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
29bf0 20 74 61 62 6c 65 20 69 73 20 75 73 65 64 20 62   table is used b
29c00 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c  y an index.  Onl
29c10 79 20 74 68 65 20 66 69 72 73 74 20 36 33 20 63  y the first 63 c
29c20 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69  olumns are consi
29c30 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dered..*/.static
29c40 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73   Bitmask columns
29c50 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  InIndex(Index *p
29c60 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  Idx){.  Bitmask 
29c70 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a  m = 0;.  int j;.
29c80 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43    for(j=pIdx->nC
29c90 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  olumn-1; j>=0; j
29ca0 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  --){.    int x =
29cb0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
29cc0 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30  j];.    if( x>=0
29cd0 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
29ce0 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a  se( x==BMS-1 );.
29cf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29d00 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20  x==BMS-2 );.    
29d10 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20    if( x<BMS-1 ) 
29d20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b  m |= MASKBIT(x);
29d30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
29d40 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65  urn m;.}../* Che
29d50 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 70  ck to see if a p
29d60 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77 69 74  artial index wit
29d70 68 20 70 50 61 72 74 49 6e 64 65 78 57 68 65 72  h pPartIndexWher
29d80 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a  e can be used.**
29d90 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
29da0 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74  query.  Return t
29db0 72 75 65 20 69 66 20 69 74 20 63 61 6e 20 62 65  rue if it can be
29dc0 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
29dd0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
29de0 20 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74   whereUsablePart
29df0 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69 54 61  ialIndex(int iTa
29e00 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  b, WhereClause *
29e10 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68 65 72  pWC, Expr *pWher
29e20 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  e){.  int i;.  W
29e30 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
29e40 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72  .  for(i=0, pTer
29e50 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
29e60 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
29e70 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73  rm++){.    if( s
29e80 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
29e90 73 45 78 70 72 28 70 54 65 72 6d 2d 3e 70 45 78  sExpr(pTerm->pEx
29ea0 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62  pr, pWhere, iTab
29eb0 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
29ec0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
29ed0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
29ee0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
29ef0 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 61   for a single ta
29f00 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ble of the join 
29f10 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a  where the table.
29f20 2a 2a 20 69 73 20 69 64 65 6e 66 69 65 64 20 62  ** is idenfied b
29f30 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  y pBuilder->pNew
29f40 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61  ->iTab.  That ta
29f50 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  ble is guarantee
29f60 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74  d to be.** a b-t
29f70 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ree table, not a
29f80 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
29f90 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73 20  **.** The costs 
29fa0 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e 29  (WhereLoop.rRun)
29fb0 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6c   of the b-tree l
29fc0 6f 6f 70 73 20 61 64 64 65 64 20 62 79 20 74 68  oops added by th
29fd0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
29fe0 72 65 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73  re calculated as
29ff0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
2a000 46 6f 72 20 61 20 66 75 6c 6c 20 73 63 61 6e 2c  For a full scan,
2a010 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20 74 61   assuming the ta
2a020 62 6c 65 20 28 6f 72 20 69 6e 64 65 78 29 20 63  ble (or index) c
2a030 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f 77  ontains nRow row
2a040 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73  s:.**.**     cos
2a050 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20 20  t = nRow * 3.0  
2a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a070 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65 20    // full-table 
2a080 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73 74  scan.**     cost
2a090 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20 20   = nRow * K     
2a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0b0 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76 65   // scan of cove
2a0c0 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20  ring index.**   
2a0d0 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20    cost = nRow * 
2a0e0 28 4b 2b 33 2e 30 29 20 20 20 20 20 20 20 20 20  (K+3.0)         
2a0f0 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f         // scan o
2a100 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  f non-covering i
2a110 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ndex.**.** where
2a120 20 4b 20 69 73 20 61 20 76 61 6c 75 65 20 62 65   K is a value be
2a130 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e  tween 1.1 and 3.
2a140 30 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74  0 set based on t
2a150 68 65 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a 20  he relative .** 
2a160 65 73 74 69 6d 61 74 65 64 20 61 76 65 72 61 67  estimated averag
2a170 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e  e size of the in
2a180 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 65  dex and table re
2a190 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  cords..**.** For
2a1a0 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c 20   an index scan, 
2a1b0 77 68 65 72 65 20 6e 56 69 73 69 74 20 69 73 20  where nVisit is 
2a1c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  the number of in
2a1d0 64 65 78 20 72 6f 77 73 20 76 69 73 69 74 65 64  dex rows visited
2a1e0 0a 2a 2a 20 62 79 20 74 68 65 20 73 63 61 6e 2c  .** by the scan,
2a1f0 20 61 6e 64 20 6e 53 65 65 6b 20 69 73 20 74 68   and nSeek is th
2a200 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 65 6b  e number of seek
2a210 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75   operations requ
2a220 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65 20  ired on .** the 
2a230 69 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a 2a  index b-tree:.**
2a240 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
2a250 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77  Seek * (log(nRow
2a260 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29 20  ) + K * nVisit) 
2a270 20 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 76 65           // cove
2a280 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20  ring index.**   
2a290 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a    cost = nSeek *
2a2a0 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28 4b   (log(nRow) + (K
2a2b0 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69 74 29 20  +3.0) * nVisit) 
2a2c0 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72 69     // non-coveri
2a2d0 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 4e  ng index.**.** N
2a2e0 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20 69  ormally, nSeek i
2a2f0 73 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75 65  s 1. nSeek value
2a300 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31  s greater than 1
2a310 20 63 6f 6d 65 20 61 62 6f 75 74 20 69 66 20 74   come about if t
2a320 68 65 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  he .** WHERE cla
2a330 75 73 65 20 69 6e 63 6c 75 64 65 73 20 22 78 20  use includes "x 
2a340 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d 73  IN (....)" terms
2a350 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
2a360 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65 6e  f "x=?". Or when
2a370 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22 78   .** implicit "x
2a380 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52   IN (SELECT x FR
2a390 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d 73 20 61  OM tbl)" terms a
2a3a0 72 65 20 61 64 64 65 64 20 66 6f 72 20 73 6b 69  re added for ski
2a3b0 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  p-scans..**.** T
2a3c0 68 65 20 65 73 74 69 6d 61 74 65 64 20 76 61 6c  he estimated val
2a3d0 75 65 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73 69  ues (nRow, nVisi
2a3e0 74 2c 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e 20  t, nSeek) often 
2a3f0 63 6f 6e 74 61 69 6e 20 61 20 6c 61 72 67 65 20  contain a large 
2a400 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e 63  amount.** of unc
2a410 65 72 74 61 69 6e 74 79 2e 20 20 46 6f 72 20 74  ertainty.  For t
2a420 68 69 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f 72  his reason, scor
2a430 69 6e 67 20 69 73 20 64 65 73 69 67 6e 65 64 20  ing is designed 
2a440 74 6f 20 70 69 63 6b 20 70 6c 61 6e 73 20 74 68  to pick plans th
2a450 61 74 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c 65  at.** "do the le
2a460 61 73 74 20 68 61 72 6d 22 20 69 66 20 74 68 65  ast harm" if the
2a470 20 65 73 74 69 6d 61 74 65 73 20 61 72 65 20 69   estimates are i
2a480 6e 61 63 63 75 72 61 74 65 2e 20 20 46 6f 72 20  naccurate.  For 
2a490 65 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c 6f  example, a.** lo
2a4a0 67 28 6e 52 6f 77 29 20 66 61 63 74 6f 72 20 69  g(nRow) factor i
2a4b0 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 61  s omitted from a
2a4c0 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
2a4d0 64 65 78 20 73 63 61 6e 20 69 6e 20 6f 72 64 65  dex scan in orde
2a4e0 72 20 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68 65  r to.** bias the
2a4f0 20 73 63 6f 72 69 6e 67 20 69 6e 20 66 61 76 6f   scoring in favo
2a500 72 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e  r of using an in
2a510 64 65 78 2c 20 73 69 6e 63 65 20 74 68 65 20 77  dex, since the w
2a520 6f 72 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65 72  orst-case.** per
2a530 66 6f 72 6d 61 6e 63 65 20 6f 66 20 75 73 69 6e  formance of usin
2a540 67 20 61 6e 20 69 6e 64 65 78 20 69 73 20 66 61  g an index is fa
2a550 72 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68  r better than th
2a560 65 20 77 6f 72 73 74 2d 63 61 73 65 20 70 65 72  e worst-case per
2a570 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20 61  formance.** of a
2a580 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
2a590 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a5a0 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
2a5b0 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  e(.  WhereLoopBu
2a5c0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
2a5d0 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
2a5e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
2a5f0 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61    Bitmask mExtra
2a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a610 20 45 78 74 72 61 20 70 72 65 72 65 71 75 65 73   Extra prereques
2a620 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74  ites for using t
2a630 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  his table */.){.
2a640 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2a650 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nfo;          /*
2a660 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20   WHERE analysis 
2a670 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64  context */.  Ind
2a680 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20  ex *pProbe;     
2a690 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
2a6a0 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c  ndex we are eval
2a6b0 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65  uating */.  Inde
2a6c0 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20  x sPk;          
2a6d0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b          /* A fak
2a6e0 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66  e index object f
2a6f0 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  or the primary k
2a700 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61  ey */.  LogEst a
2a710 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20  iRowEstPk[2];   
2a720 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77      /* The aiRow
2a730 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65 20 66  LogEst[] value f
2a740 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
2a750 20 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c 75   */.  i16 aiColu
2a760 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20  mnPk = -1;      
2a770 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e    /* The aColumn
2a780 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
2a790 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
2a7a0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2a7b0 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
2a7c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
2a7d0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
2a7e0 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20  st_item *pSrc;  
2a7f0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
2a800 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f  se btree term to
2a810 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c   add */.  WhereL
2a820 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  oop *pNew;      
2a830 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74        /* Templat
2a840 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
2a850 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ct */.  int rc =
2a860 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2a870 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2a880 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  de */.  int iSor
2a890 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20  tIdx = 1;       
2a8a0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d      /* Index num
2a8b0 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20  ber */.  int b; 
2a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8d0 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61       /* A boolea
2a8e0 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67  n value */.  Log
2a8f0 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20  Est rSize;      
2a900 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62           /* numb
2a910 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
2a920 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67  e table */.  Log
2a930 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  Est rLogSize;   
2a940 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
2a950 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d  rithm of the num
2a960 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
2a970 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
2a980 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
2a990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2a9a0 20 70 61 72 73 65 64 20 57 48 45 52 45 20 63 6c   parsed WHERE cl
2a9b0 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  ause */.  Table 
2a9c0 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
2a9d0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
2a9e0 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
2a9f0 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69    .  pNew = pBui
2aa00 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57  lder->pNew;.  pW
2aa10 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
2aa20 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c  >pWInfo;.  pTabL
2aa30 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
2aa40 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d  abList;.  pSrc =
2aa50 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70   pTabList->a + p
2aa60 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54 61  New->iTab;.  pTa
2aa70 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  b = pSrc->pTab;.
2aa80 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
2aa90 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28  ->pWC;.  assert(
2aaa0 20 21 49 73 56 69 72 74 75 61 6c 28 70 53 72 63   !IsVirtual(pSrc
2aab0 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66  ->pTab) );..  if
2aac0 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29  ( pSrc->pIndex )
2aad0 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45  {.    /* An INDE
2aae0 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73 70  XED BY clause sp
2aaf0 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69 63  ecifies a partic
2ab00 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73  ular index to us
2ab10 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65 20  e */.    pProbe 
2ab20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a  = pSrc->pIndex;.
2ab30 20 20 7d 65 6c 73 65 20 69 66 28 20 21 48 61 73    }else if( !Has
2ab40 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
2ab50 20 20 20 70 50 72 6f 62 65 20 3d 20 70 54 61 62     pProbe = pTab
2ab60 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  ->pIndex;.  }els
2ab70 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
2ab80 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  is no INDEXED BY
2ab90 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65   clause.  Create
2aba0 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62   a fake Index ob
2abb0 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20  ject in local.  
2abc0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50    ** variable sP
2abd0 6b 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74  k to represent t
2abe0 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79  he rowid primary
2abf0 20 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b   key index.  Mak
2ac00 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61  e this.    ** fa
2ac10 6b 65 20 69 6e 64 65 78 20 74 68 65 20 66 69 72  ke index the fir
2ac20 73 74 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66  st in a chain of
2ac30 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77   Index objects w
2ac40 69 74 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72  ith all of the r
2ac50 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63  eal.    ** indic
2ac60 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  es to follow */.
2ac70 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73      Index *pFirs
2ac80 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2ac90 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20      /* First of 
2aca0 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20  real indices on 
2acb0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
2acc0 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c   memset(&sPk, 0,
2acd0 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b   sizeof(Index));
2ace0 0a 20 20 20 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c  .    sPk.nKeyCol
2acf0 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 6e 43   = 1;.    sPk.nC
2ad00 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73  olumn = 1;.    s
2ad10 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61  Pk.aiColumn = &a
2ad20 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73  iColumnPk;.    s
2ad30 50 6b 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d  Pk.aiRowLogEst =
2ad40 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20   aiRowEstPk;.   
2ad50 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f   sPk.onError = O
2ad60 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 73  E_Replace;.    s
2ad70 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  Pk.pTable = pTab
2ad80 3b 0a 20 20 20 20 73 50 6b 2e 73 7a 49 64 78 52  ;.    sPk.szIdxR
2ad90 6f 77 20 3d 20 70 54 61 62 2d 3e 73 7a 54 61 62  ow = pTab->szTab
2ada0 52 6f 77 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Row;.    aiRowEs
2adb0 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e  tPk[0] = pTab->n
2adc0 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 20 20 61  RowLogEst;.    a
2add0 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 30  iRowEstPk[1] = 0
2ade0 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d 20 70  ;.    pFirst = p
2adf0 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65  Src->pTab->pInde
2ae00 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  x;.    if( pSrc-
2ae10 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29  >notIndexed==0 )
2ae20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
2ae30 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74  eal indices of t
2ae40 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c  he table are onl
2ae50 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20  y considered if 
2ae60 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54  the.      ** NOT
2ae70 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69   INDEXED qualifi
2ae80 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  er is omitted fr
2ae90 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  om the FROM clau
2aea0 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e  se */.      sPk.
2aeb0 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a  pNext = pFirst;.
2aec0 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65      }.    pProbe
2aed0 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72   = &sPk;.  }.  r
2aee0 53 69 7a 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f  Size = pTab->nRo
2aef0 77 4c 6f 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53  wLogEst;.  rLogS
2af00 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69  ize = estLog(rSi
2af10 7a 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ze);..#ifndef SQ
2af20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
2af30 54 49 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41  TIC_INDEX.  /* A
2af40 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73  utomatic indexes
2af50 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c   */.  if( !pBuil
2af60 64 65 72 2d 3e 70 4f 72 53 65 74 0a 20 20 20 26  der->pOrSet.   &
2af70 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  & (pWInfo->pPars
2af80 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
2af90 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29  QLITE_AutoIndex)
2afa0 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e  !=0.   && pSrc->
2afb0 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26 26 20  pIndex==0.   && 
2afc0 21 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74  !pSrc->viaCorout
2afd0 69 6e 65 0a 20 20 20 26 26 20 21 70 53 72 63 2d  ine.   && !pSrc-
2afe0 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20 20 26  >notIndexed.   &
2aff0 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  & HasRowid(pTab)
2b000 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73  .   && !pSrc->is
2b010 43 6f 72 72 65 6c 61 74 65 64 0a 20 20 20 26 26  Correlated.   &&
2b020 20 21 70 53 72 63 2d 3e 69 73 52 65 63 75 72 73   !pSrc->isRecurs
2b030 69 76 65 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ive.  ){.    /* 
2b040 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e  Generate auto-in
2b050 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a  dex WhereLoops *
2b060 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
2b070 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72  *pTerm;.    Wher
2b080 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20  eTerm *pWCEnd = 
2b090 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54  pWC->a + pWC->nT
2b0a0 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65  erm;.    for(pTe
2b0b0 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53  rm=pWC->a; rc==S
2b0c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72  QLITE_OK && pTer
2b0d0 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
2b0e0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54  +){.      if( pT
2b0f0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
2b100 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
2b110 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  f ) continue;.  
2b120 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
2b130 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
2b140 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20   pSrc, 0) ){.   
2b150 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
2b160 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20  ee.nEq = 1;.    
2b170 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
2b180 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  e.nSkip = 0;.   
2b190 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
2b1a0 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
2b1b0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54         pNew->nLT
2b1c0 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
2b1d0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
2b1e0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
2b1f0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65    /* TUNING: One
2b200 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63  -time cost for c
2b210 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74  omputing the aut
2b220 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a  omatic index is.
2b230 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 72 6f          ** appro
2b240 78 69 6d 61 74 65 6c 79 20 37 2a 4e 2a 6c 6f 67  ximately 7*N*log
2b250 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20  2(N) where N is 
2b260 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
2b270 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ws in.        **
2b280 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
2b290 20 69 6e 64 65 78 65 64 2e 20 2a 2f 0a 20 20 20   indexed. */.   
2b2a0 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
2b2b0 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72  p = rLogSize + r
2b2c0 53 69 7a 65 20 2b 20 32 38 3b 20 20 61 73 73 65  Size + 28;  asse
2b2d0 72 74 28 20 32 38 3d 3d 73 71 6c 69 74 65 33 4c  rt( 28==sqlite3L
2b2e0 6f 67 45 73 74 28 37 29 20 29 3b 0a 20 20 20 20  ogEst(7) );.    
2b2f0 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c      ApplyCostMul
2b300 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 53  tiplier(pNew->rS
2b310 65 74 75 70 2c 20 70 54 61 62 2d 3e 63 6f 73 74  etup, pTab->cost
2b320 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 2f  Mult);.        /
2b330 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20 69  * TUNING: Each i
2b340 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c  ndex lookup yiel
2b350 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74 68  ds 20 rows in th
2b360 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a 20  e table.  This. 
2b370 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72         ** is mor
2b380 65 20 74 68 61 6e 20 74 68 65 20 75 73 75 61 6c  e than the usual
2b390 20 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f 77   guess of 10 row
2b3a0 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76 65  s, since we have
2b3b0 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20 20   no way.        
2b3c0 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 68 6f  ** of knowing ho
2b3d0 77 20 73 65 6c 65 63 74 69 76 65 20 74 68 65 20  w selective the 
2b3e0 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d  index will ultim
2b3f0 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77 6f  ately be.  It wo
2b400 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  uld.        ** n
2b410 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61 62  ot be unreasonab
2b420 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20  le to make this 
2b430 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67 65  value much large
2b440 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  r. */.        pN
2b450 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20  ew->nOut = 43;  
2b460 61 73 73 65 72 74 28 20 34 33 3d 3d 73 71 6c 69  assert( 43==sqli
2b470 74 65 33 4c 6f 67 45 73 74 28 32 30 29 20 29 3b  te3LogEst(20) );
2b480 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
2b490 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
2b4a0 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c  EstAdd(rLogSize,
2b4b0 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20  pNew->nOut);.   
2b4c0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
2b4d0 67 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs = WHERE_AUTO_
2b4e0 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70  INDEX;.        p
2b4f0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45  New->prereq = mE
2b500 78 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72  xtra | pTerm->pr
2b510 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
2b520 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2b530 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
2b540 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d  , pNew);.      }
2b550 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2b560 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2b570 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
2b580 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f   */..  /* Loop o
2b590 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a  ver all indices.
2b5a0 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d    */.  for(; rc=
2b5b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
2b5c0 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72  robe; pProbe=pPr
2b5d0 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72  obe->pNext, iSor
2b5e0 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28  tIdx++){.    if(
2b5f0 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64   pProbe->pPartId
2b600 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26  xWhere!=0.     &
2b610 26 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61  & !whereUsablePa
2b620 72 74 69 61 6c 49 6e 64 65 78 28 70 53 72 63 2d  rtialIndex(pSrc-
2b630 3e 69 43 75 72 73 6f 72 2c 20 70 57 43 2c 20 70  >iCursor, pWC, p
2b640 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57  Probe->pPartIdxW
2b650 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 74  here) ){.      t
2b660 65 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e 69  estcase( pNew->i
2b670 54 61 62 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  Tab!=pSrc->iCurs
2b680 6f 72 20 29 3b 20 20 2f 2a 20 53 65 65 20 74 69  or );  /* See ti
2b690 63 6b 65 74 20 5b 39 38 64 39 37 33 62 38 66 35  cket [98d973b8f5
2b6a0 5d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  ] */.      conti
2b6b0 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c  nue;  /* Partial
2b6c0 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72   index inappropr
2b6d0 69 61 74 65 20 66 6f 72 20 74 68 69 73 20 71 75  iate for this qu
2b6e0 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ery */.    }.   
2b6f0 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d   rSize = pProbe-
2b700 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b  >aiRowLogEst[0];
2b710 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
2b720 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20  ee.nEq = 0;.    
2b730 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53  pNew->u.btree.nS
2b740 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  kip = 0;.    pNe
2b750 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  w->nLTerm = 0;. 
2b760 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
2b770 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  x = 0;.    pNew-
2b780 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  >rSetup = 0;.   
2b790 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
2b7a0 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e 65 77  mExtra;.    pNew
2b7b0 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a  ->nOut = rSize;.
2b7c0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
2b7d0 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62  e.pIndex = pProb
2b7e0 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78  e;.    b = index
2b7f0 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64  MightHelpWithOrd
2b800 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70  erBy(pBuilder, p
2b810 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75  Probe, pSrc->iCu
2b820 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68  rsor);.    /* Th
2b830 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  e ONEPASS_DESIRE
2b840 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63  D flags never oc
2b850 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77 69  curs together wi
2b860 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  th ORDER BY */. 
2b870 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49 6e     assert( (pWIn
2b880 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
2b890 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
2b8a0 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d  ESIRED)==0 || b=
2b8b0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
2b8c0 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b  robe->tnum<=0 ){
2b8d0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65  .      /* Intege
2b8e0 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  r primary key in
2b8f0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  dex */.      pNe
2b900 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
2b910 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f  RE_IPK;..      /
2b920 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  * Full table sca
2b930 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  n */.      pNew-
2b940 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
2b950 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20  iSortIdx : 0;.  
2b960 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
2b970 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c  ost of full tabl
2b980 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30  e scan is (N*3.0
2b990 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  ). */.      pNew
2b9a0 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b  ->rRun = rSize +
2b9b0 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70 6c 79   16;.      Apply
2b9c0 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70  CostMultiplier(p
2b9d0 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d  New->rRun, pTab-
2b9e0 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20  >costMult);.    
2b9f0 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
2ba00 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65  tAdjust(pWC, pNe
2ba10 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20  w, rSize);.     
2ba20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
2ba30 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
2ba40 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65  pNew);.      pNe
2ba50 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
2ba60 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2ba70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
2ba80 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
2ba90 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  m;.      if( pPr
2baa0 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  obe->isCovering 
2bab0 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
2bac0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
2bad0 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
2bae0 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
2baf0 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20     m = 0;.      
2bb00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
2bb10 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
2bb20 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64   & ~columnsInInd
2bb30 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  ex(pProbe);.    
2bb40 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
2bb50 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48  s = (m==0) ? (WH
2bb60 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45  ERE_IDX_ONLY|WHE
2bb70 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48  RE_INDEXED) : WH
2bb80 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
2bb90 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
2bba0 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64  ull scan via ind
2bbb0 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ex */.      if( 
2bbc0 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73  b.       || !Has
2bbd0 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 20  Rowid(pTab).    
2bbe0 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20     || ( m==0.   
2bbf0 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d        && pProbe-
2bc00 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20  >bUnordered==0. 
2bc10 20 20 20 20 20 20 20 20 26 26 20 28 70 50 72 6f          && (pPro
2bc20 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61  be->szIdxRow<pTa
2bc30 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20 20  b->szTabRow).   
2bc40 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
2bc50 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2bc60 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2bc70 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20  IRED)==0.       
2bc80 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62    && sqlite3Glob
2bc90 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73  alConfig.bUseCis
2bca0 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74  .         && Opt
2bcb0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
2bcc0 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  (pWInfo->pParse-
2bcd0 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65  >db, SQLITE_Cove
2bce0 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20  rIdxScan).      
2bcf0 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20      ).      ){. 
2bd00 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f         pNew->iSo
2bd10 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72  rtIdx = b ? iSor
2bd20 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20 20  tIdx : 0;..     
2bd30 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f     /* The cost o
2bd40 66 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 69  f visiting the i
2bd50 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e 2a 4b  ndex rows is N*K
2bd60 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20 20 20  , where K is.   
2bd70 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20       ** between 
2bd80 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64 65 70  1.1 and 3.0, dep
2bd90 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 72 65  ending on the re
2bda0 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20  lative sizes of 
2bdb0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
2bdc0 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72  ndex and table r
2bdd0 6f 77 73 2e 20 49 66 20 74 68 69 73 20 69 73 20  ows. If this is 
2bde0 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
2bdf0 6e 64 65 78 20 73 63 61 6e 2c 0a 20 20 20 20 20  ndex scan,.     
2be00 20 20 20 2a 2a 20 61 6c 73 6f 20 61 64 64 20 74     ** also add t
2be10 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74  he cost of visit
2be20 69 6e 67 20 74 61 62 6c 65 20 72 6f 77 73 20 28  ing table rows (
2be30 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20 20 20 20  N*3.0).  */.    
2be40 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2be50 20 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31 35   rSize + 1 + (15
2be60 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f  *pProbe->szIdxRo
2be70 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  w)/pTab->szTabRo
2be80 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  w;.        if( m
2be90 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2bea0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
2beb0 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
2bec0 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 53 69 7a 65  New->rRun, rSize
2bed0 2b 31 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  +16);.        }.
2bee0 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73          ApplyCos
2bef0 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77  tMultiplier(pNew
2bf00 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f  ->rRun, pTab->co
2bf10 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  stMult);.       
2bf20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
2bf30 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77  Adjust(pWC, pNew
2bf40 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  , rSize);.      
2bf50 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2bf60 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
2bf70 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
2bf80 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
2bf90 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
2bfa0 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
2bfb0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72    }.    }..    r
2bfc0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2bfd0 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
2bfe0 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
2bff0 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51  e, 0);.#ifdef SQ
2c000 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
2c010 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73  3_OR_STAT4.    s
2c020 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
2c030 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70  Free(pBuilder->p
2c040 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64  Rec);.    pBuild
2c050 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
2c060 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  0;.    pBuilder-
2c070 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69  >pRec = 0;.#endi
2c080 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  f..    /* If the
2c090 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45  re was an INDEXE
2c0a0 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
2c0b0 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20  n only that one 
2c0c0 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20  index is.    ** 
2c0d0 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20  considered. */. 
2c0e0 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e     if( pSrc->pIn
2c0f0 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  dex ) break;.  }
2c100 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c110 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c120 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2c130 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  E./*.** Add all 
2c140 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2c150 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66  s for a table of
2c160 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69   the join identi
2c170 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c  fied by.** pBuil
2c180 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e  der->pNew->iTab.
2c190 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20    That table is 
2c1a0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
2c1b0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
2c1c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c1d0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
2c1e0 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ual(.  WhereLoop
2c1f0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
2c200 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  r,  /* WHERE cla
2c210 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
2c220 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  */.  Bitmask mEx
2c230 74 72 61 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e  tra.){.  WhereIn
2c240 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
2c250 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
2c260 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
2c270 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
2c280 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
2c290 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
2c2a0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
2c2b0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
2c2c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2c2d0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
2c2e0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
2c2f0 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20  st_item *pSrc;  
2c300 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
2c310 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
2c320 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ch */.  Table *p
2c330 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
2c340 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  db;.  sqlite3_in
2c350 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
2c360 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  fo;.  struct sql
2c370 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
2c380 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
2c390 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
2c3a0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
2c3b0 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65  nt_usage *pUsage
2c3c0 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
2c3d0 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Term;.  int i, j
2c3e0 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d  ;.  int iTerm, m
2c3f0 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f  xTerm;.  int nCo
2c400 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20  nstraint;.  int 
2c410 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20  seenIn = 0;     
2c420 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2c430 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   if an IN operat
2c440 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20  or is seen */.  
2c450 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20 30 3b  int seenVar = 0;
2c460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c470 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f  True if a non-co
2c480 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e  nstant constrain
2c490 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69  t is seen */.  i
2c4a0 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20 20 20  nt iPhase;      
2c4b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
2c4c0 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20  : const w/o IN, 
2c4d0 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20  1: const, 2: no 
2c4e0 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20  IN,  2: IN */.  
2c4f0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
2c500 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2c510 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f  TE_OK;..  pWInfo
2c520 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
2c530 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
2c540 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
2c550 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
2c560 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  b;.  pWC = pBuil
2c570 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77  der->pWC;.  pNew
2c580 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
2c590 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49  w;.  pSrc = &pWI
2c5a0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
2c5b0 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20  [pNew->iTab];.  
2c5c0 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61  pTab = pSrc->pTa
2c5d0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73 56  b;.  assert( IsV
2c5e0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a  irtual(pTab) );.
2c5f0 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c    pIdxInfo = all
2c600 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70  ocateIndexInfo(p
2c610 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63  Parse, pWC, pSrc
2c620 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64  , pBuilder->pOrd
2c630 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70 49 64  erBy);.  if( pId
2c640 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  xInfo==0 ) retur
2c650 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2c660 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
2c670 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74   0;.  pNew->rSet
2c680 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  up = 0;.  pNew->
2c690 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
2c6a0 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20  VIRTUALTABLE;.  
2c6b0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
2c6c0 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
2c6d0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
2c6e0 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e   pUsage = pIdxIn
2c6f0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
2c700 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61  sage;.  nConstra
2c710 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  int = pIdxInfo->
2c720 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69  nConstraint;.  i
2c730 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
2c740 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f  ze(db, pNew, nCo
2c750 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20  nstraint) ){.   
2c760 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2c770 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20  b, pIdxInfo);.  
2c780 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c790 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f  NOMEM;.  }..  fo
2c7a0 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50 68 61  r(iPhase=0; iPha
2c7b0 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29  se<=3; iPhase++)
2c7c0 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 49  {.    if( !seenI
2c7d0 6e 20 26 26 20 28 69 50 68 61 73 65 26 31 29 21  n && (iPhase&1)!
2c7e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 68 61  =0 ){.      iPha
2c7f0 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  se++;.      if( 
2c800 69 50 68 61 73 65 3e 33 20 29 20 62 72 65 61 6b  iPhase>3 ) break
2c810 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2c820 21 73 65 65 6e 56 61 72 20 26 26 20 69 50 68 61  !seenVar && iPha
2c830 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20  se>1 ) break;.  
2c840 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
2c850 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
2c860 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
2c870 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
2c880 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72  straint;.    for
2c890 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f  (i=0; i<pIdxInfo
2c8a0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
2c8b0 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
2c8c0 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43  .      j = pIdxC
2c8d0 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
2c8e0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
2c8f0 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
2c900 20 20 73 77 69 74 63 68 28 20 69 50 68 61 73 65    switch( iPhase
2c910 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
2c920 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61   0:    /* Consta
2c930 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e 20 6f  nts without IN o
2c940 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
2c950 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
2c960 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  sable = 0;.     
2c970 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
2c980 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2c990 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
2c9a0 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d 20 31        seenIn = 1
2c9b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c9c0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
2c9d0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 21 3d  m->prereqRight!=
2c9e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2c9f0 20 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20   seenVar = 1;.  
2ca00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2ca10 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
2ca20 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20  tor & WO_IN)==0 
2ca30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
2ca40 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
2ca50 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
2ca60 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2ca70 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 31  ;.        case 1
2ca80 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74  :    /* Constant
2ca90 73 20 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74  s with IN operat
2caa0 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ors */.         
2cab0 20 61 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20   assert( seenIn 
2cac0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  );.          pId
2cad0 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
2cae0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
2caf0 67 68 74 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20  ght==0);.       
2cb00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2cb10 20 20 63 61 73 65 20 32 3a 20 20 20 20 2f 2a 20    case 2:    /* 
2cb20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 6f 75  Variables withou
2cb30 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  t IN */.        
2cb40 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61    assert( seenVa
2cb50 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r );.          p
2cb60 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
2cb70 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  = (pTerm->eOpera
2cb80 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b  tor & WO_IN)==0;
2cb90 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2cba0 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  ;.        defaul
2cbb0 74 3a 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  t:   /* Variable
2cbc0 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20  s with IN */.   
2cbd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
2cbe0 65 65 6e 56 61 72 20 26 26 20 73 65 65 6e 49 6e  eenVar && seenIn
2cbf0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49   );.          pI
2cc00 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
2cc10 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
2cc20 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2cc30 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55   }.    memset(pU
2cc40 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sage, 0, sizeof(
2cc50 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49  pUsage[0])*pIdxI
2cc60 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
2cc70 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49  );.    if( pIdxI
2cc80 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2cc90 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f  dxStr ) sqlite3_
2cca0 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69  free(pIdxInfo->i
2ccb0 64 78 53 74 72 29 3b 0a 20 20 20 20 70 49 64 78  dxStr);.    pIdx
2ccc0 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30  Info->idxStr = 0
2ccd0 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
2cce0 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  idxNum = 0;.    
2ccf0 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
2cd00 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
2cd10 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72      pIdxInfo->or
2cd20 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
2cd30 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
2cd40 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
2cd50 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20   SQLITE_BIG_DBL 
2cd60 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20  / (double)2;.   
2cd70 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
2cd80 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20  atedRows = 25;. 
2cd90 20 20 20 72 63 20 3d 20 76 74 61 62 42 65 73 74     rc = vtabBest
2cda0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 54  Index(pParse, pT
2cdb0 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  ab, pIdxInfo);. 
2cdc0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2cdd0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61   whereLoopAddVta
2cde0 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49 64 78  b_exit;.    pIdx
2cdf0 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
2ce00 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
2ce10 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
2ce20 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
2ce30 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  t;.    pNew->pre
2ce40 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20  req = mExtra;.  
2ce50 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20    mxTerm = -1;. 
2ce60 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
2ce70 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72  >nLSlot>=nConstr
2ce80 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72 28  aint );.    for(
2ce90 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
2cea0 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61  nt; i++) pNew->a
2ceb0 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20  LTerm[i] = 0;.  
2cec0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f    pNew->u.vtab.o
2ced0 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  mitMask = 0;.   
2cee0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
2cef0 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
2cf00 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20  dxCons++){.     
2cf10 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55   if( (iTerm = pU
2cf20 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
2cf30 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20  x - 1)>=0 ){.   
2cf40 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e       j = pIdxCon
2cf50 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
2cf60 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
2cf70 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20  m>=nConstraint. 
2cf80 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20          || j<0. 
2cf90 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57          || j>=pW
2cfa0 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  C->nTerm.       
2cfb0 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72    || pNew->aLTer
2cfc0 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20  m[iTerm]!=0.    
2cfd0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2cfe0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
2cff0 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  OR;.          sq
2d000 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2d010 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49  arse, "%s.xBestI
2d020 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69  ndex() malfuncti
2d030 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  on", pTab->zName
2d040 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
2d050 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  o whereLoopAddVt
2d060 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ab_exit;.       
2d070 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
2d080 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e  ase( iTerm==nCon
2d090 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20  straint-1 );.   
2d0a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
2d0b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
2d0c0 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d  estcase( j==pWC-
2d0d0 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20  >nTerm-1 );.    
2d0e0 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
2d0f0 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[j];.        
2d100 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20  pNew->prereq |= 
2d110 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
2d120 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
2d130 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e  rt( iTerm<pNew->
2d140 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20  nLSlot );.      
2d150 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69    pNew->aLTerm[i
2d160 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  Term] = pTerm;. 
2d170 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d         if( iTerm
2d180 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d  >mxTerm ) mxTerm
2d190 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20   = iTerm;.      
2d1a0 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
2d1b0 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 20  m==15 );.       
2d1c0 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d   testcase( iTerm
2d1d0 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 20 20  ==16 );.        
2d1e0 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20  if( iTerm<16 && 
2d1f0 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29  pUsage[i].omit )
2d200 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
2d210 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65  itMask |= 1<<iTe
2d220 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
2d230 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2d240 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b  r & WO_IN)!=0 ){
2d250 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2d260 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30  Usage[i].omit==0
2d270 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d280 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  /* Do not attemp
2d290 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20 63  t to use an IN c
2d2a0 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68 65  onstraint if the
2d2b0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20   virtual table. 
2d2c0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61             ** sa
2d2d0 79 73 20 74 68 61 74 20 74 68 65 20 65 71 75 69  ys that the equi
2d2e0 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74 72  valent EQ constr
2d2f0 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 73  aint cannot be s
2d300 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20  afely omitted.. 
2d310 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66             ** If
2d320 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20 74   we do attempt t
2d330 6f 20 75 73 65 20 73 75 63 68 20 61 20 63 6f 6e  o use such a con
2d340 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f  straint, some ro
2d350 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20  ws might be.    
2d360 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61          ** repea
2d370 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ted in the outpu
2d380 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
2d390 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2d3a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
2d3b0 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * A virtual tabl
2d3c0 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72  e that is constr
2d3d0 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63  ained by an IN c
2d3e0 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20  lause may not.  
2d3f0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75          ** consu
2d400 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  me the ORDER BY 
2d410 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20 28  clause because (
2d420 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  1) the order of 
2d430 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20  IN terms.       
2d440 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63     ** is not nec
2d450 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64  essarily related
2d460 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66   to the order of
2d470 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e   output terms an
2d480 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 28  d.          ** (
2d490 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70  2) Multiple outp
2d4a0 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  uts from a singl
2d4b0 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20  e IN value will 
2d4c0 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20  not merge.      
2d4d0 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e      ** together.
2d4e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
2d4f0 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
2d500 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
2d510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2d520 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
2d530 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a  =nConstraint ){.
2d540 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
2d550 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20  rm = mxTerm+1;. 
2d560 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
2d570 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d  w->nLTerm<=pNew-
2d580 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
2d590 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
2d5a0 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xNum = pIdxInfo-
2d5b0 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70  >idxNum;.      p
2d5c0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
2d5d0 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  Free = pIdxInfo-
2d5e0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
2d5f0 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  r;.      pIdxInf
2d600 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2d610 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Str = 0;.      p
2d620 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  New->u.vtab.idxS
2d630 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69  tr = pIdxInfo->i
2d640 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e 65  dxStr;.      pNe
2d650 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65  w->u.vtab.isOrde
2d660 72 65 64 20 3d 20 28 69 38 29 28 70 49 64 78 49  red = (i8)(pIdxI
2d670 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
2d680 75 6d 65 64 20 3f 0a 20 20 20 20 20 20 20 20 20  umed ?.         
2d690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
2d6b0 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
2d6c0 3a 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  : 0);.      pNew
2d6d0 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
2d6e0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2d6f0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72   sqlite3LogEstFr
2d700 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66  omDouble(pIdxInf
2d710 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
2d720 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  );.      pNew->n
2d730 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Out = sqlite3Log
2d740 45 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73  Est(pIdxInfo->es
2d750 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 20 20  timatedRows);.  
2d760 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73      whereLoopIns
2d770 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2d780 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ew);.      if( p
2d790 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
2d7a0 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
2d7b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
2d7c0 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  w->u.vtab.idxStr
2d7d0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
2d7e0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
2d7f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
2d800 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65    }.  }  ..where
2d810 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74  LoopAddVtab_exit
2d820 3a 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  :.  if( pIdxInfo
2d830 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2d840 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  tr ) sqlite3_fre
2d850 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  e(pIdxInfo->idxS
2d860 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  tr);.  sqlite3Db
2d870 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66  Free(db, pIdxInf
2d880 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  o);.  return rc;
2d890 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2d8a0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2d8b0 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
2d8c0 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  Add WhereLoop en
2d8d0 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20  tries to handle 
2d8e0 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20  OR terms.  This 
2d8f0 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72  works for either
2d900 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69  .** btrees or vi
2d910 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f  rtual tables..*/
2d920 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2d930 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68 65 72 65  eLoopAddOr(Where
2d940 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
2d950 69 6c 64 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d  ilder, Bitmask m
2d960 45 78 74 72 61 29 7b 0a 20 20 57 68 65 72 65 49  Extra){.  WhereI
2d970 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
2d980 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
2d990 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2d9a0 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  WC;.  WhereLoop 
2d9b0 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65  *pNew;.  WhereTe
2d9c0 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45  rm *pTerm, *pWCE
2d9d0 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  nd;.  int rc = S
2d9e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
2d9f0 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61  iCur;.  WhereCla
2da00 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68  use tempWC;.  Wh
2da10 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73  ereLoopBuilder s
2da20 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72  SubBuild;.  Wher
2da30 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75  eOrSet sSum, sCu
2da40 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  r;.  struct SrcL
2da50 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2da60 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69  .  .  pWC = pBui
2da70 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28  lder->pWC;.  if(
2da80 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2da90 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f  ags & WHERE_AND_
2daa0 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e 20 53 51  ONLY ) return SQ
2dab0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e  LITE_OK;.  pWCEn
2dac0 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
2dad0 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20  ->nTerm;.  pNew 
2dae0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
2daf0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d  ;.  memset(&sSum
2db00 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d  , 0, sizeof(sSum
2db10 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57  ));.  pItem = pW
2db20 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
2db30 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
2db40 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
2db50 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28  iCursor;..  for(
2db60 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
2db70 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63  erm<pWCEnd && rc
2db80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65  ==SQLITE_OK; pTe
2db90 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
2dba0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2dbb0 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20   & WO_OR)!=0.   
2dbc0 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70    && (pTerm->u.p
2dbd0 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
2dbe0 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  e & pNew->maskSe
2dbf0 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  lf)!=0 .    ){. 
2dc00 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
2dc10 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d   * const pOrWC =
2dc20 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
2dc30 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68  fo->wc;.      Wh
2dc40 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20  ereTerm * const 
2dc50 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57  pOrWCEnd = &pOrW
2dc60 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72  C->a[pOrWC->nTer
2dc70 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  m];.      WhereT
2dc80 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20  erm *pOrTerm;.  
2dc90 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31      int once = 1
2dca0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  ;.      int i, j
2dcb0 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73 53 75  ;.    .      sSu
2dcc0 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64  bBuild = *pBuild
2dcd0 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75  er;.      sSubBu
2dce0 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ild.pOrderBy = 0
2dcf0 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
2dd00 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72  d.pOrSet = &sCur
2dd10 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72  ;..      for(pOr
2dd20 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70  Term=pOrWC->a; p
2dd30 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b  OrTerm<pOrWCEnd;
2dd40 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
2dd50 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
2dd60 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2dd70 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20  O_AND)!=0 ){.   
2dd80 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
2dd90 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d  .pWC = &pOrTerm-
2dda0 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  >u.pAndInfo->wc;
2ddb0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2ddc0 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
2ddd0 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a  Cursor==iCur ){.
2dde0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
2ddf0 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70  .pWInfo = pWC->p
2de00 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  WInfo;.         
2de10 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d   tempWC.pOuter =
2de20 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pWC;.          
2de30 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41  tempWC.op = TK_A
2de40 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ND;.          te
2de50 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a  mpWC.nTerm = 1;.
2de60 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
2de70 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20  .a = pOrTerm;.  
2de80 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c          sSubBuil
2de90 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b  d.pWC = &tempWC;
2dea0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2deb0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2dec0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
2ded0 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30        sCur.n = 0
2dee0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2def0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2df00 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  LE.        if( I
2df10 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
2df20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
2df30 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2df40 70 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75  pAddVirtual(&sSu
2df50 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b  bBuild, mExtra);
2df60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
2df70 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
2df80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
2df90 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
2dfa0 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78  (&sSubBuild, mEx
2dfb0 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tra);.        }.
2dfc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2dfd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
2dfe0 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20   sCur.n==0 );.  
2dff0 20 20 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e        if( sCur.n
2e000 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2e010 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20   sSum.n = 0;.   
2e020 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2e030 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2e040 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  once ){.        
2e050 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
2e060 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20  Sum, &sCur);.   
2e070 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b         once = 0;
2e080 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2e090 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4f            WhereO
2e0a0 72 53 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20  rSet sPrev;.    
2e0b0 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76        whereOrMov
2e0c0 65 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29  e(&sPrev, &sSum)
2e0d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d  ;.          sSum
2e0e0 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
2e0f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72    for(i=0; i<sPr
2e100 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ev.n; i++){.    
2e110 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
2e120 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b   j<sCur.n; j++){
2e130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  .              w
2e140 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53  hereOrInsert(&sS
2e150 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70  um, sPrev.a[i].p
2e160 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a  rereq | sCur.a[j
2e170 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20  ].prereq,.      
2e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e190 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67        sqlite3Log
2e1a0 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69  EstAdd(sPrev.a[i
2e1b0 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a  ].rRun, sCur.a[j
2e1c0 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20  ].rRun),.       
2e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1e0 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45       sqlite3LogE
2e1f0 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d  stAdd(sPrev.a[i]
2e200 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d  .nOut, sCur.a[j]
2e210 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20  .nOut));.       
2e220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e230 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2e240 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
2e250 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
2e260 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
2e270 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
2e280 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2e290 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  = WHERE_MULTI_OR
2e2a0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53  ;.      pNew->rS
2e2b0 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  etup = 0;.      
2e2c0 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
2e2d0 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   0;.      memset
2e2e0 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69  (&pNew->u, 0, si
2e2f0 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a  zeof(pNew->u));.
2e300 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72        for(i=0; r
2e310 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2e320 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a  i<sSum.n; i++){.
2e330 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
2e340 47 3a 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75  G: Currently sSu
2e350 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73  m.a[i].rRun is s
2e360 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66  et to the sum of
2e370 20 74 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20   the costs.     
2e380 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62     ** of all sub
2e390 2d 73 63 61 6e 73 20 72 65 71 75 69 72 65 64 20  -scans required 
2e3a0 62 79 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20  by the OR-scan. 
2e3b0 48 6f 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20  However, due to 
2e3c0 72 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20  rounding.       
2e3d0 20 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d   ** errors, it m
2e3e0 61 79 20 62 65 20 74 68 61 74 20 74 68 65 20 63  ay be that the c
2e3f0 6f 73 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63  ost of the OR-sc
2e400 61 6e 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69  an is equal to i
2e410 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  ts.        ** mo
2e420 73 74 20 65 78 70 65 6e 73 69 76 65 20 73 75 62  st expensive sub
2e430 2d 73 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73  -scan. Add the s
2e440 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65  mallest possible
2e450 20 70 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20   penalty .      
2e460 20 20 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74    ** (equivalent
2e470 20 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20   to multiplying 
2e480 74 68 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37  the cost by 1.07
2e490 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  ) to ensure that
2e4a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69   .        ** thi
2e4b0 73 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65  s does not happe
2e4c0 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  n. Otherwise, fo
2e4d0 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20  r WHERE clauses 
2e4e0 73 75 63 68 20 61 73 20 74 68 65 0a 20 20 20 20  such as the.    
2e4f0 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
2e500 20 77 68 65 72 65 20 74 68 65 72 65 20 69 73 20   where there is 
2e510 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a  an index on "y":
2e520 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2e530 20 20 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45      **     WHERE
2e540 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c   likelihood(x=?,
2e550 20 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20   0.99) OR y=?.  
2e560 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2e570 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20   ** the planner 
2e580 6d 61 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52  may elect to "OR
2e590 22 20 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c  " together a ful
2e5a0 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64  l-table scan and
2e5b0 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   an.        ** i
2e5c0 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64  ndex lookup. And
2e5d0 20 6f 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79   other similarly
2e5e0 20 6f 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a   odd results.  *
2e5f0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
2e600 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  rRun = sSum.a[i]
2e610 2e 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20  .rRun + 1;.     
2e620 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
2e630 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a  sSum.a[i].nOut;.
2e640 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
2e650 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  ereq = sSum.a[i]
2e660 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20  .prereq;.       
2e670 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
2e680 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
2e690 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
2e6a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2e6b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
2e6c0 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
2e6d0 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
2e6e0 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74   tables .*/.stat
2e6f0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
2e700 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70  AddAll(WhereLoop
2e710 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
2e720 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  r){.  WhereInfo 
2e730 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
2e740 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69  er->pWInfo;.  Bi
2e750 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30  tmask mExtra = 0
2e760 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69  ;.  Bitmask mPri
2e770 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  or = 0;.  int iT
2e780 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
2e790 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
2e7a0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74  ->pTabList;.  st
2e7b0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2e7c0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
2e7d0 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f  te3 *db = pWInfo
2e7e0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
2e7f0 69 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70  int nTabList = p
2e800 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20  WInfo->nLevel;. 
2e810 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2e820 5f 4f 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a  _OK;.  u8 priorJ
2e830 6f 69 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20 57  oinType = 0;.  W
2e840 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
2e850 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
2e860 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
2e870 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66  e join, from lef
2e880 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20  t to right */.  
2e890 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
2e8a0 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f  >pNew;.  whereLo
2e8b0 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20  opInit(pNew);.  
2e8c0 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65  for(iTab=0, pIte
2e8d0 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
2e8e0 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54  Tab<nTabList; iT
2e8f0 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a  ab++, pItem++){.
2e900 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d      pNew->iTab =
2e910 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d   iTab;.    pNew-
2e920 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d  >maskSelf = getM
2e930 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
2e940 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43  skSet, pItem->iC
2e950 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
2e960 28 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  ((pItem->jointyp
2e970 65 7c 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29  e|priorJoinType)
2e980 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43   & (JT_LEFT|JT_C
2e990 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20  ROSS))!=0 ){.   
2e9a0 20 20 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69     mExtra = mPri
2e9b0 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72  or;.    }.    pr
2e9c0 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49  iorJoinType = pI
2e9d0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
2e9e0 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
2e9f0 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b  (pItem->pTab) ){
2ea00 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
2ea10 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
2ea20 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61  pBuilder, mExtra
2ea30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2ea40 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2ea50 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c  opAddBtree(pBuil
2ea60 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  der, mExtra);.  
2ea70 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2ea80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ea90 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2eaa0 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c  pAddOr(pBuilder,
2eab0 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a   mExtra);.    }.
2eac0 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e      mPrior |= pN
2ead0 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  ew->maskSelf;.  
2eae0 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e    if( rc || db->
2eaf0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
2eb00 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72  reak;.  }.  wher
2eb10 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
2eb20 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  New);.  return r
2eb30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d  c;.}../*.** Exam
2eb40 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68 20  ine a WherePath 
2eb50 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69  (with the additi
2eb60 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  on of the extra 
2eb70 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65  WhereLoop of the
2eb80 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65   5th.** paramete
2eb90 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69 74  rs) to see if it
2eba0 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e   outputs rows in
2ebb0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 4f   the requested O
2ebc0 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47  RDER BY.** (or G
2ebd0 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75 74  ROUP BY) without
2ebe0 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65 70   requiring a sep
2ebf0 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61  arate sort opera
2ec00 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a  tion.  Return N:
2ec10 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20  .** .**   N>0:  
2ec20 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20   N terms of the 
2ec30 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2ec40 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
2ec50 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72     N==0:  No ter
2ec60 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
2ec70 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73 61  BY clause are sa
2ec80 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30  tisfied.**   N<0
2ec90 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20  :   Unknown yet 
2eca0 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f  how many terms o
2ecb0 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74  f ORDER BY might
2ecc0 20 62 65 20 73 61 74 69 73 66 69 65 64 2e 20 20   be satisfied.  
2ecd0 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61   .**.** Note tha
2ece0 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  t processing for
2ecf0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61   WHERE_GROUPBY a
2ed00 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  nd WHERE_DISTINC
2ed10 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a  TBY is not as.**
2ed20 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20 47   strict.  With G
2ed30 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
2ed40 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65  INCT the only re
2ed50 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61  quirement is tha
2ed60 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  t.** equivalent 
2ed70 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65  rows appear imme
2ed80 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74  diately adjacent
2ed90 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e   to one another.
2eda0 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e    GROUP BY.** an
2edb0 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f  d DISTINCT do no
2edc0 74 20 72 65 71 75 69 72 65 20 72 6f 77 73 20 74  t require rows t
2edd0 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20  o appear in any 
2ede0 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
2edf0 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65   as long.** as e
2ee00 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61  quivalent rows a
2ee10 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74  re grouped toget
2ee20 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47  her.  Thus for G
2ee30 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
2ee40 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64  INCT.** the pOrd
2ee50 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62  erBy terms can b
2ee60 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79  e matched in any
2ee70 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52   order.  With OR
2ee80 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20  DER BY, the .** 
2ee90 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d  pOrderBy terms m
2eea0 75 73 74 20 62 65 20 6d 61 74 63 68 65 64 20 69  ust be matched i
2eeb0 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f  n strict left-to
2eec0 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f  -right order..*/
2eed0 0a 73 74 61 74 69 63 20 69 38 20 77 68 65 72 65  .static i8 where
2eee0 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
2eef0 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66  erBy(.  WhereInf
2ef00 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a  o *pWInfo,    /*
2ef10 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
2ef20 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
2ef30 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
2ef40 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
2ef50 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54  P BY or DISTINCT
2ef60 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b   clause to check
2ef70 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
2ef80 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54  *pPath,     /* T
2ef90 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20  he WherePath to 
2efa0 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77  check */.  u16 w
2efb0 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
2efc0 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69   /* Might contai
2efd0 6e 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  n WHERE_GROUPBY 
2efe0 6f 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  or WHERE_DISTINC
2eff0 54 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f  TBY */.  u16 nLo
2f000 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  op,            /
2f010 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
2f020 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c  ies in pPath->aL
2f030 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  oop[] */.  Where
2f040 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20  Loop *pLast,    
2f050 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65   /* Add this Whe
2f060 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e  reLoop to the en
2f070 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  d of pPath->aLoo
2f080 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  p[] */.  Bitmask
2f090 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f   *pRevMask     /
2f0a0 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57  * OUT: Mask of W
2f0b0 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e  hereLoops to run
2f0c0 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
2f0d0 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76  r */.){.  u8 rev
2f0e0 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Set;            
2f0f0 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69  /* True if rev i
2f100 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20  s known */.  u8 
2f110 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
2f120 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20     /* Composite 
2f130 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
2f140 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20  u8 revIdx;      
2f150 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
2f160 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
2f170 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  8 isOrderDistinc
2f180 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f  t;   /* All prio
2f190 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65  r WhereLoops are
2f1a0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20   order-distinct 
2f1b0 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74  */.  u8 distinct
2f1c0 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72  Columns;   /* Tr
2f1d0 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68  ue if the loop h
2f1e0 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55  as UNIQUE NOT NU
2f1f0 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  LL columns */.  
2f200 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20  u8 isMatch;     
2f210 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e        /* iColumn
2f220 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d 20   matches a term 
2f230 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
2f240 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20  clause */.  u16 
2f250 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20  nKeyCol;        
2f260 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b    /* Number of k
2f270 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49  ey columns in pI
2f280 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43  ndex */.  u16 nC
2f290 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
2f2a0 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
2f2b0 6f 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d  of ordered colum
2f2c0 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
2f2d0 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42  */.  u16 nOrderB
2f2e0 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
2f2f0 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68  mber terms in th
2f300 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2f310 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70  e */.  int iLoop
2f320 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2f330 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f  Index of WhereLo
2f340 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e  op in pPath bein
2f350 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  g processed */. 
2f360 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
2f370 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2f380 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
2f390 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
2f3a0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
2f3b0 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20  ber for current 
2f3c0 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69  WhereLoop */.  i
2f3d0 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt iColumn;     
2f3e0 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e       /* A column
2f3f0 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74   number within t
2f400 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57  able iCur */.  W
2f410 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
2f420 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  = 0; /* Current 
2f430 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20  WhereLoop being 
2f440 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20  processed. */.  
2f450 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2f460 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c  ;     /* A singl
2f470 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
2f480 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
2f490 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20  Expr *pOBExpr;  
2f4a0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72        /* An expr
2f4b0 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ession from the 
2f4c0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2f4d0 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
2f4e0 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f  oll;       /* CO
2f4f0 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66  LLATE function f
2f500 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20  rom an ORDER BY 
2f510 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
2f520 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
2f530 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
2f540 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
2f550 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73  ith pLoop */.  s
2f560 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
2f570 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
2f580 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
2f590 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  nnection */.  Bi
2f5a0 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b  tmask obSat = 0;
2f5b0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f      /* Mask of O
2f5c0 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61  RDER BY terms sa
2f5d0 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a  tisfied so far *
2f5e0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f  /.  Bitmask obDo
2f5f0 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ne;       /* Mas
2f600 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42  k of all ORDER B
2f610 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74  Y terms */.  Bit
2f620 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e  mask orderDistin
2f630 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b  ctMask;  /* Mask
2f640 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64   of all well-ord
2f650 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20  ered loops */.  
2f660 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20  Bitmask ready;  
2f670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2f680 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f  ask of inner loo
2f690 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ps */..  /*.  **
2f6a0 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72   We say the Wher
2f6b0 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f  eLoop is "one-ro
2f6c0 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61 74  w" if it generat
2f6d0 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  es no more than 
2f6e0 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  one.  ** row of 
2f6f0 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72 65  output.  A Where
2f700 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20  Loop is one-row 
2f710 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
2f720 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
2f730 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20  :.  **  (a) All 
2f740 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61  index columns ma
2f750 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43  tch with WHERE_C
2f760 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20  OLUMN_EQ..  **  
2f770 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73  (b) The index is
2f780 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79   unique.  ** Any
2f790 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20   WhereLoop with 
2f7a0 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  an WHERE_COLUMN_
2f7b0 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  EQ constraint on
2f7c0 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e   the rowid is on
2f7d0 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72  e-row..  ** Ever
2f7e0 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c  y one-row WhereL
2f7f0 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68  oop will have th
2f800 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62  e WHERE_ONEROW b
2f810 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67  it set in wsFlag
2f820 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  s..  **.  ** We 
2f830 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  say the WhereLoo
2f840 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74  p is "order-dist
2f850 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65 74  inct" if the set
2f860 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d   of columns from
2f870 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65  .  ** that Where
2f880 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e  Loop that are in
2f890 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2f8a0 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72 65  ause are differe
2f8b0 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a  nt for every.  *
2f8c0 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65  * row of the Whe
2f8d0 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f  reLoop.  Every o
2f8e0 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70  ne-row WhereLoop
2f8f0 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
2f900 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73  y.  ** order-dis
2f910 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65  tinct.   A Where
2f920 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f  Loop that has no
2f930 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
2f940 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
2f950 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65    ** is not orde
2f960 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62  r-distinct. To b
2f970 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
2f980 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68   is not quite th
2f990 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a  e same as being.
2f9a0 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63    ** UNIQUE sinc
2f9b0 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d  e a UNIQUE colum
2f9c0 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68  n or index can h
2f9d0 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  ave multiple row
2f9e0 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65  s that .  ** are
2f9f0 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76   NULL and NULL v
2fa00 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76 61  alues are equiva
2fa10 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72  lent for the pur
2fa20 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69  pose of order-di
2fa30 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20  stinct..  ** To 
2fa40 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
2fa50 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d  t, the columns m
2fa60 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e  ust be UNIQUE an
2fa70 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a  d NOT NULL..  **
2fa80 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20  .  ** The rowid 
2fa90 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20 61  for a table is a
2faa0 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64  lways UNIQUE and
2fab0 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65   NOT NULL so whe
2fac0 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72  never the.  ** r
2fad0 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e 20  owid appears in 
2fae0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2faf0 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  use, the corresp
2fb00 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  onding WhereLoop
2fb10 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74   is.  ** automat
2fb20 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73  ically order-dis
2fb30 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61  tinct..  */..  a
2fb40 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21  ssert( pOrderBy!
2fb50 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f  =0 );.  if( nLoo
2fb60 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f  p && Optimizatio
2fb70 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
2fb80 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a  LITE_OrderByIdxJ
2fb90 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
2fba0 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ..  nOrderBy = p
2fbb0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
2fbc0 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64    testcase( nOrd
2fbd0 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  erBy==BMS-1 );. 
2fbe0 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d   if( nOrderBy>BM
2fbf0 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  S-1 ) return 0; 
2fc00 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d   /* Cannot optim
2fc10 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65  ize overly large
2fc20 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20   ORDER BYs */.  
2fc30 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2fc40 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20  = 1;.  obDone = 
2fc50 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79  MASKBIT(nOrderBy
2fc60 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74  )-1;.  orderDist
2fc70 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  inctMask = 0;.  
2fc80 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72  ready = 0;.  for
2fc90 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65  (iLoop=0; isOrde
2fca0 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53  rDistinct && obS
2fcb0 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f  at<obDone && iLo
2fcc0 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70  op<=nLoop; iLoop
2fcd0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f  ++){.    if( iLo
2fce0 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20  op>0 ) ready |= 
2fcf0 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  pLoop->maskSelf;
2fd00 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f  .    pLoop = iLo
2fd10 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68  op<nLoop ? pPath
2fd20 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a  ->aLoop[iLoop] :
2fd30 20 70 4c 61 73 74 3b 0a 20 20 20 20 69 66 28 20   pLast;.    if( 
2fd40 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2fd50 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
2fd60 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  BLE ){.      if(
2fd70 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
2fd80 73 4f 72 64 65 72 65 64 20 29 20 6f 62 53 61 74  sOrdered ) obSat
2fd90 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20   = obDone;.     
2fda0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2fdb0 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d    iCur = pWInfo-
2fdc0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f  >pTabList->a[pLo
2fdd0 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f  op->iTab].iCurso
2fde0 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20  r;..    /* Mark 
2fdf0 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59  off any ORDER BY
2fe00 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73 20   term X that is 
2fe10 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
2fe20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20  table of.    ** 
2fe30 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
2fe40 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65   for which there
2fe50 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20   is term in the 
2fe60 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61  WHERE.    ** cla
2fe70 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  use of the form 
2fe80 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f  X IS NULL or X=?
2fe90 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
2fea0 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a  only outer.    *
2feb0 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a  * loops..    */.
2fec0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2fed0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
2fee0 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54       if( MASKBIT
2fef0 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f  (i) & obSat ) co
2ff00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f  ntinue;.      pO
2ff10 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  BExpr = sqlite3E
2ff20 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
2ff30 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2ff40 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
2ff50 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  pOBExpr->op!=TK_
2ff60 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75  COLUMN ) continu
2ff70 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42  e;.      if( pOB
2ff80 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43  Expr->iTable!=iC
2ff90 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
2ffa0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e       pTerm = fin
2ffb0 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73  dTerm(&pWInfo->s
2ffc0 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70  WC, iCur, pOBExp
2ffd0 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  r->iColumn,.    
2ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fff0 20 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51     ~ready, WO_EQ
30000 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a  |WO_ISNULL, 0);.
30010 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
30020 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
30030 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
30040 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51  >eOperator&WO_EQ
30050 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d  )!=0 && pOBExpr-
30060 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20  >iColumn>=0 ){. 
30070 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
30080 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20  r *z1, *z2;.    
30090 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
300a0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
300b0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
300c0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
300d0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
300e0 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
300f0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
30100 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70  ;.        z1 = p
30110 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Coll->zName;.   
30120 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
30130 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
30140 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
30150 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pTerm->pExpr);. 
30160 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
30170 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
30180 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
30190 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a     z2 = pColl->z
301a0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
301b0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
301c0 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f  (z1, z2)!=0 ) co
301d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
301e0 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d        obSat |= M
301f0 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d  ASKBIT(i);.    }
30200 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  ..    if( (pLoop
30210 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
30220 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a  E_ONEROW)==0 ){.
30230 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
30240 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
30250 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  _IPK ){.        
30260 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
30270 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b      nKeyCol = 0;
30280 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  .        nColumn
30290 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
302a0 65 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20  e if( (pIndex = 
302b0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
302c0 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e  Index)==0 || pIn
302d0 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  dex->bUnordered 
302e0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
302f0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 0;.      }else
30300 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f  {.        nKeyCo
30310 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  l = pIndex->nKey
30320 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  Col;.        nCo
30330 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e  lumn = pIndex->n
30340 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
30350 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
30360 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48  =nKeyCol+1 || !H
30370 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e  asRowid(pIndex->
30380 70 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20  pTable) );.     
30390 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
303a0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c  x->aiColumn[nCol
303b0 75 6d 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20  umn-1]==(-1) || 
303c0 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78  !HasRowid(pIndex
303d0 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  ->pTable));.    
303e0 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
303f0 6e 63 74 20 3d 20 49 73 55 6e 69 71 75 65 49 6e  nct = IsUniqueIn
30400 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 20  dex(pIndex);.   
30410 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c     }..      /* L
30420 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
30430 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
30440 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69  ndex and deal wi
30450 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20  th the ones.    
30460 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f    ** that are no
30470 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  t constrained by
30480 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20   == or IN..     
30490 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20   */.      rev = 
304a0 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20  revSet = 0;.    
304b0 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
304c0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  s = 0;.      for
304d0 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b  (j=0; j<nColumn;
304e0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   j++){.        u
304f0 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72  8 bOnce;   /* Tr
30500 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52  ue to run the OR
30510 44 45 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f  DER BY search lo
30520 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  op */..        /
30530 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61  * Skip over == a
30540 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73  nd IS NULL terms
30550 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
30560 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  j<pLoop->u.btree
30570 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
30580 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
30590 6e 53 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20 20  nSkip==0.       
305a0 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70    && ((i = pLoop
305b0 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70  ->aLTerm[j]->eOp
305c0 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51  erator) & (WO_EQ
305d0 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a  |WO_ISNULL))!=0.
305e0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
305f0 20 20 20 20 20 69 66 28 20 69 20 26 20 57 4f 5f       if( i & WO_
30600 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ISNULL ){.      
30610 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
30620 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
30630 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
30640 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
30650 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
30660 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
30670 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d 0a  ue;  .        }.
30680 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20  .        /* Get 
30690 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
306a0 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28  r in the table (
306b0 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72  iColumn) and sor
306c0 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  t order.        
306d0 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72 20  ** (revIdx) for 
306e0 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20  the j-th column 
306f0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  of the index..  
30700 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
30710 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
30720 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
30730 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c   = pIndex->aiCol
30740 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
30750 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65    revIdx = pInde
30760 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  x->aSortOrder[j]
30770 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30780 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d  iColumn==pIndex-
30790 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29  >pTable->iPKey )
307a0 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
307b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
307c0 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
307d0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
307e0 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  revIdx = 0;.    
307f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
30800 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e  * An unconstrain
30810 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d  ed column that m
30820 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61  ight be NULL mea
30830 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20 20 20  ns that this.   
30840 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f       ** WhereLoo
30850 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72  p is not well-or
30860 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f  dered.        */
30870 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
30880 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20  rderDistinct.   
30890 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e        && iColumn
308a0 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  >=0.         && 
308b0 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  j>=pLoop->u.btre
308c0 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26  e.nEq.         &
308d0 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  & pIndex->pTable
308e0 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e  ->aCol[iColumn].
308f0 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20  notNull==0.     
30900 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
30910 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
30920 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
30930 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20          /* Find 
30940 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72  the ORDER BY ter
30950 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  m that correspon
30960 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63  ds to the j-th c
30970 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a  olumn.        **
30980 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
30990 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45  d mark that ORDE
309a0 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20  R BY term off . 
309b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
309c0 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20    bOnce = 1;.   
309d0 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30       isMatch = 0
309e0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
309f0 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f  0; bOnce && i<nO
30a00 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
30a10 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b          if( MASK
30a20 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
30a30 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
30a40 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73       pOBExpr = s
30a50 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
30a60 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e  llate(pOrderBy->
30a70 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
30a80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
30a90 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
30aa0 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20  ERE_GROUPBY );. 
30ab0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
30ac0 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  e( wctrlFlags & 
30ad0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
30ae0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
30af0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
30b00 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57  (WHERE_GROUPBY|W
30b10 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29  HERE_DISTINCTBY)
30b20 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30  )==0 ) bOnce = 0
30b30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30b40 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  pOBExpr->op!=TK_
30b50 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75  COLUMN ) continu
30b60 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
30b70 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65   pOBExpr->iTable
30b80 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  !=iCur ) continu
30b90 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
30ba0 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
30bb0 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  n!=iColumn ) con
30bc0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
30bd0 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20   if( iColumn>=0 
30be0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
30bf0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
30c00 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
30c10 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
30c20 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
30c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
30c40 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
30c50 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
30c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
30c70 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
30c80 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
30c90 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29  ndex->azColl[j])
30ca0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
30cb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30cc0 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
30cd0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
30ce0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
30cf0 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63        if( isMatc
30d00 68 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63  h && (pWInfo->wc
30d10 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
30d20 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a  _GROUPBY)==0 ){.
30d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
30d40 65 20 73 75 72 65 20 74 68 65 20 73 6f 72 74 20  e sure the sort 
30d50 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69  order is compati
30d60 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20  ble in an ORDER 
30d70 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20  BY clause..     
30d80 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64       ** Sort ord
30d90 65 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74  er is irrelevant
30da0 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20   for a GROUP BY 
30db0 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20  clause. */.     
30dc0 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74 20       if( revSet 
30dd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
30de0 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78  f( (rev ^ revIdx
30df0 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  )!=pOrderBy->a[i
30e00 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69 73  ].sortOrder ) is
30e10 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  Match = 0;.     
30e20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30e30 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65          rev = re
30e40 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d  vIdx ^ pOrderBy-
30e50 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
30e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
30e70 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b   rev ) *pRevMask
30e80 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f   |= MASKBIT(iLoo
30e90 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
30ea0 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20  revSet = 1;.    
30eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30ec0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
30ed0 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Match ){.       
30ee0 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30     if( iColumn<0
30ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30f00 74 65 73 74 63 61 73 65 28 20 64 69 73 74 69 6e  testcase( distin
30f10 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a  ctColumns==0 );.
30f20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
30f30 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b  inctColumns = 1;
30f40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30f50 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20         obSat |= 
30f60 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
30f70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30f80 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68       /* No match
30f90 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
30fa0 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20      if( j==0 || 
30fb0 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  j<nKeyCol ){.   
30fc0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
30fd0 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
30fe0 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct!=0 );.       
30ff0 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
31000 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
31010 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
31020 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
31030 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20  .      } /* end 
31040 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
31050 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  dex columns */. 
31060 20 20 20 20 20 69 66 28 20 64 69 73 74 69 6e 63       if( distinc
31070 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20  tColumns ){.    
31080 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
31090 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30  OrderDistinct==0
310a0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72   );.        isOr
310b0 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b  derDistinct = 1;
310c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f  .      }.    } /
310d0 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65  * end-if not one
310e0 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  -row */..    /* 
310f0 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68  Mark off any oth
31100 65 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  er ORDER BY term
31110 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  s that reference
31120 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66   pLoop */.    if
31130 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
31140 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72  t ){.      order
31150 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20  DistinctMask |= 
31160 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  pLoop->maskSelf;
31170 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
31180 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
31190 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
311a0 70 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  p;.        Bitma
311b0 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20  sk mTerm;.      
311c0 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
311d0 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
311e0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d  nue;.        p =
311f0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
31200 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6d  pExpr;.        m
31210 54 65 72 6d 20 3d 20 65 78 70 72 54 61 62 6c 65  Term = exprTable
31220 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73  Usage(&pWInfo->s
31230 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20  MaskSet,p);.    
31240 20 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30      if( mTerm==0
31250 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
31260 49 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29 20  IsConstant(p) ) 
31270 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
31280 20 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72    if( (mTerm&~or
31290 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29  derDistinctMask)
312a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
312b0 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49   obSat |= MASKBI
312c0 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  T(i);.        }.
312d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
312e0 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f  } /* End the loo
312f0 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65  p over all Where
31300 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72  Loops from outer
31310 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e  -most down to in
31320 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66  ner-most */.  if
31330 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20  ( obSat==obDone 
31340 29 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f 72  ) return (i8)nOr
31350 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69 73  derBy;.  if( !is
31360 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b  OrderDistinct ){
31370 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65  .    for(i=nOrde
31380 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  rBy-1; i>0; i--)
31390 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
313a0 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20 2d  m = MASKBIT(i) -
313b0 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f   1;.      if( (o
313c0 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74  bSat&m)==m ) ret
313d0 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  urn i;.    }.   
313e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
313f0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a   return -1;.}...
31400 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45  /*.** If the WHE
31410 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20  RE_GROUPBY flag 
31420 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d 61  is set in the ma
31430 73 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  sk passed to sql
31440 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
31450 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72  ,.** the planner
31460 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
31470 65 20 73 70 65 63 69 66 69 65 64 20 70 4f 72 64  e specified pOrd
31480 65 72 42 79 20 6c 69 73 74 20 69 73 20 61 63 74  erBy list is act
31490 75 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a  ually a GROUP.**
314a0 20 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e 64   BY clause - and
314b0 20 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74 68   so any order th
314c0 61 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20 61  at groups rows a
314d0 73 20 72 65 71 75 69 72 65 64 20 73 61 74 69 73  s required satis
314e0 66 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71 75  fies the.** requ
314f0 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  est..**.** Norma
31500 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61 73  lly, in this cas
31510 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
31520 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61 6c  ible for the cal
31530 6c 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ler to determine
31540 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e  .** whether or n
31550 6f 74 20 74 68 65 20 72 6f 77 73 20 61 72 65 20  ot the rows are 
31560 72 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c  really being del
31570 69 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65 64  ivered in sorted
31580 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75   order, or.** ju
31590 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  st in some other
315a0 20 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f 76   order that prov
315b0 69 64 65 73 20 74 68 65 20 72 65 71 75 69 72 65  ides the require
315c0 64 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65  d grouping. Howe
315d0 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57  ver,.** if the W
315e0 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
315f0 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70 61   flag is also pa
31600 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
31610 68 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68 65  hereBegin(), the
31620 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  n.** this functi
31630 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
31640 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   on the returned
31650 20 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63   WhereInfo objec
31660 74 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a  t. It returns.**
31670 20 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77   true if the row
31680 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65  s really will be
31690 20 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20 73   sorted in the s
316a0 70 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c 20  pecified order, 
316b0 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65  or false.** othe
316c0 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rwise..**.** For
316d0 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
316e0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  ng:.**.**   CREA
316f0 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
31700 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74  1(x, Y);.**.** t
31710 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  hen.**.**   SELE
31720 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f  CT * FROM t1 GRO
31730 55 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52 20  UP BY x,y ORDER 
31740 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53  BY x,y;   -- IsS
31750 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20  orted()==1.**   
31760 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
31770 20 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f 52   GROUP BY y,x OR
31780 44 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d  DER BY y,x;   --
31790 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a   IsSorted()==0.*
317a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
317b0 72 65 49 73 53 6f 72 74 65 64 28 57 68 65 72 65  reIsSorted(Where
317c0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
317d0 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
317e0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
317f0 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20  ERE_GROUPBY );. 
31800 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
31810 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
31820 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
31830 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
31840 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23  fo->sorted;.}..#
31850 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
31860 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20  _ENABLED./* For 
31870 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e  debugging use on
31880 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ly: */.static co
31890 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72 65 50  nst char *whereP
318a0 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74  athName(WherePat
318b0 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c  h *pPath, int nL
318c0 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  oop, WhereLoop *
318d0 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63  pLast){.  static
318e0 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b   char zName[65];
318f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
31900 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b  i=0; i<nLoop; i+
31910 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70  +){ zName[i] = p
31920 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e  Path->aLoop[i]->
31930 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61  cId; }.  if( pLa
31940 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20  st ) zName[i++] 
31950 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20  = pLast->cId;.  
31960 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  zName[i] = 0;.  
31970 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
31980 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
31990 74 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66  turn the cost of
319a0 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72 6f   sorting nRow ro
319b0 77 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  ws, assuming tha
319c0 74 20 74 68 65 20 6b 65 79 73 20 68 61 76 65 20  t the keys have 
319d0 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f 6c  .** nOrderby col
319e0 75 6d 6e 73 20 61 6e 64 20 74 68 61 74 20 74 68  umns and that th
319f0 65 20 66 69 72 73 74 20 6e 53 6f 72 74 65 64 20  e first nSorted 
31a00 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72 65  columns are alre
31a10 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e  ady in.** order.
31a20 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73  .*/.static LogEs
31a30 74 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f  t whereSortingCo
31a40 73 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  st(.  WhereInfo 
31a50 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73  *pWInfo,.  LogEs
31a60 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f  t nRow,.  int nO
31a70 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53  rderBy,.  int nS
31a80 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55  orted.){.  /* TU
31a90 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20  NING: Estimated 
31aa0 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 65  cost of a full e
31ab0 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68  xternal sort, wh
31ac0 65 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74  ere N is .  ** t
31ad0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
31ae0 73 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20  s to sort is:.  
31af0 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d  **.  **   cost =
31b00 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28   (3.0 * N * log(
31b10 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  N))..  ** .  ** 
31b20 4f 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65 72  Or, if the order
31b30 2d 62 79 20 63 6c 61 75 73 65 20 68 61 73 20 58  -by clause has X
31b40 20 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20   terms but only 
31b50 74 68 65 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a  the last Y .  **
31b60 20 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20 6f   terms are out o
31b70 66 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62 6c  f order, then bl
31b80 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c  ock-sorting will
31b90 20 72 65 64 75 63 65 20 74 68 65 20 0a 20 20 2a   reduce the .  *
31ba0 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20 74  * sorting cost t
31bb0 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63  o:.  **.  **   c
31bc0 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a  ost = (3.0 * N *
31bd0 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58 29   log(N)) * (Y/X)
31be0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28  .  **.  ** The (
31bf0 59 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d 70  Y/X) term is imp
31c00 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 73  lemented using s
31c10 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72 53  tack variable rS
31c20 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e  cale.  ** below.
31c30 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53    */.  LogEst rS
31c40 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b  cale, rSortCost;
31c50 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65  .  assert( nOrde
31c60 72 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c  rBy>0 && 66==sql
31c70 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20  ite3LogEst(100) 
31c80 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20 73 71  );.  rScale = sq
31c90 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72  lite3LogEst((nOr
31ca0 64 65 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31  derBy-nSorted)*1
31cb0 30 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20 36  00/nOrderBy) - 6
31cc0 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d  6;.  rSortCost =
31cd0 20 6e 52 6f 77 20 2b 20 65 73 74 4c 6f 67 28 6e   nRow + estLog(n
31ce0 52 6f 77 29 20 2b 20 72 53 63 61 6c 65 20 2b 20  Row) + rScale + 
31cf0 31 36 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  16;..  /* TUNING
31d00 3a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 69 6d  : The cost of im
31d10 70 6c 65 6d 65 6e 74 69 6e 67 20 44 49 53 54 49  plementing DISTI
31d20 4e 43 54 20 75 73 69 6e 67 20 61 20 42 2d 54 52  NCT using a B-TR
31d30 45 45 20 69 73 0a 20 20 2a 2a 20 73 69 6d 69 6c  EE is.  ** simil
31d40 61 72 20 62 75 74 20 77 69 74 68 20 61 20 6c 61  ar but with a la
31d50 72 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 6f 66  rger constant of
31d60 20 70 72 6f 70 6f 72 74 69 6f 6e 61 6c 69 74 79   proportionality
31d70 2e 20 0a 20 20 2a 2a 20 4d 75 6c 74 69 70 6c 79  . .  ** Multiply
31d80 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61   by an additiona
31d90 6c 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 30 2e  l factor of 3.0.
31da0 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66    */.  if( pWInf
31db0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
31dc0 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
31dd0 4e 43 54 20 29 7b 0a 20 20 20 20 72 53 6f 72 74  NCT ){.    rSort
31de0 43 6f 73 74 20 2b 3d 20 31 36 3b 0a 20 20 7d 0a  Cost += 16;.  }.
31df0 0a 20 20 72 65 74 75 72 6e 20 72 53 6f 72 74 43  .  return rSortC
31e00 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ost;.}../*.** Gi
31e10 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ven the list of 
31e20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
31e30 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  s at pWInfo->pLo
31e40 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ops, this routin
31e50 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  e.** attempts to
31e60 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74   find the lowest
31e70 20 63 6f 73 74 20 70 61 74 68 20 74 68 61 74 20   cost path that 
31e80 76 69 73 69 74 73 20 65 61 63 68 20 57 68 65 72  visits each Wher
31e90 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20  eLoop.** once.  
31ea0 54 68 69 73 20 70 61 74 68 20 69 73 20 74 68 65  This path is the
31eb0 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68  n loaded into th
31ec0 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57  e pWInfo->a[].pW
31ed0 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a  Loop fields..**.
31ee0 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74  ** Assume that t
31ef0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
31f00 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74  of output rows t
31f10 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  hat will need to
31f20 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69   be sorted.** wi
31f30 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69  ll be nRowEst (i
31f40 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65  n the 10*log2 re
31f50 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20  presentation).  
31f60 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69  Or, ignore sorti
31f70 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e  ng.** costs if n
31f80 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  RowEst==0..**.**
31f90 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
31fa0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
31fb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20  SQLITE_NOMEM of 
31fc0 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
31fd0 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  ion.** error occ
31fe0 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
31ff0 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76  nt wherePathSolv
32000 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  er(WhereInfo *pW
32010 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f  Info, LogEst nRo
32020 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43  wEst){.  int mxC
32030 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20  hoice;          
32040 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
32050 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e  mber of simultan
32060 65 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b  eous paths track
32070 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  ed */.  int nLoo
32080 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
32090 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
320a0 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  erms in the join
320b0 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
320c0 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
320d0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
320e0 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
320f0 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
32100 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
32110 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
32120 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20    int iLoop;    
32130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
32140 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72  oop counter over
32150 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
32160 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  e join */.  int 
32170 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20  ii, jj;         
32180 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
32190 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
321a0 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mxI = 0;        
321b0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
321c0 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20  f next entry to 
321d0 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74  replace */.  int
321e0 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
321f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
32200 20 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61   of ORDER BY cla
32210 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c  use terms */.  L
32220 6f 67 45 73 74 20 6d 78 43 6f 73 74 20 3d 20 30  ogEst mxCost = 0
32230 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69  ;        /* Maxi
32240 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65  mum cost of a se
32250 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20  t of paths */.  
32260 4c 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72 74 65  LogEst mxUnsorte
32270 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78  d = 0;    /* Max
32280 69 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f  imum unsorted co
32290 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70  st of a set of p
322a0 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  ath */.  int nTo
322b0 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20  , nFrom;        
322c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
322d0 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e  valid entries in
322e0 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d   aTo[] and aFrom
322f0 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  [] */.  WherePat
32300 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20  h *aFrom;       
32310 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70    /* All nFrom p
32320 61 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76  aths at the prev
32330 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  ious level */.  
32340 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20  WherePath *aTo; 
32350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
32360 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20   nTo best paths 
32370 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
32380 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50  evel */.  WhereP
32390 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20  ath *pFrom;     
323a0 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e      /* An elemen
323b0 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61  t of aFrom[] tha
323c0 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  t we are working
323d0 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61   on */.  WherePa
323e0 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20  th *pTo;        
323f0 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
32400 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77   of aTo[] that w
32410 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
32420 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
32430 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  *pWLoop;        
32440 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68  /* One of the Wh
32450 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
32460 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
32470 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *pX;           /
32480 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75  * Used to divy u
32490 70 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d  p the pSpace mem
324a0 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ory */.  LogEst 
324b0 2a 61 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20  *aSortCost = 0; 
324c0 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e     /* Sorting an
324d0 64 20 70 61 72 74 69 61 6c 20 73 6f 72 74 69 6e  d partial sortin
324e0 67 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61  g costs */.  cha
324f0 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  r *pSpace;      
32500 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
32510 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  ary memory used 
32520 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
32530 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 3b  */.  int nSpace;
32540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32550 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
32560 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 53   allocated at pS
32570 70 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73  pace */..  pPars
32580 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
32590 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
325a0 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d  e->db;.  nLoop =
325b0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b   pWInfo->nLevel;
325c0 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f  .  /* TUNING: Fo
325d0 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73  r simple queries
325e0 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20  , only the best 
325f0 70 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e  path is tracked.
32600 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20  .  ** For 2-way 
32610 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73  joins, the 5 bes
32620 74 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c  t paths are foll
32630 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a  owed..  ** For j
32640 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72  oins of 3 or mor
32650 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20  e tables, track 
32660 74 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68  the 10 best path
32670 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20  s */.  mxChoice 
32680 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31  = (nLoop<=1) ? 1
32690 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35   : (nLoop==2 ? 5
326a0 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74   : 10);.  assert
326b0 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d  ( nLoop<=pWInfo-
326c0 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  >pTabList->nSrc 
326d0 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  );.  WHERETRACE(
326e0 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65  0x002, ("---- be
326f0 67 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52  gin solver.  (nR
32700 6f 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52  owEst=%d)\n", nR
32710 6f 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49  owEst));..  /* I
32720 66 20 6e 52 6f 77 45 73 74 20 69 73 20 7a 65 72  f nRowEst is zer
32730 6f 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61  o and there is a
32740 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
32750 65 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e  e, ignore it. In
32760 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 73 65 20   this.  ** case 
32770 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74  the purpose of t
32780 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 65  his call is to e
32790 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
327a0 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72  er of rows retur
327b0 6e 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  ned.  ** by the 
327c0 6f 76 65 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f  overall query. O
327d0 6e 63 65 20 74 68 69 73 20 65 73 74 69 6d 61 74  nce this estimat
327e0 65 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69  e has been obtai
327f0 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a  ned, the caller.
32800 20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65    ** will invoke
32810 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
32820 20 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61   second time, pa
32830 73 73 69 6e 67 20 74 68 65 20 65 73 74 69 6d 61  ssing the estima
32840 74 65 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e  te as the.  ** n
32850 52 6f 77 45 73 74 20 70 61 72 61 6d 65 74 65 72  RowEst parameter
32860 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e  .  */.  if( pWIn
32870 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  fo->pOrderBy==0 
32880 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b  || nRowEst==0 ){
32890 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  .    nOrderBy = 
328a0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
328b0 6e 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e 66  nOrderBy = pWInf
328c0 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
328d0 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  pr;.  }..  /* Al
328e0 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
328f0 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20  alize space for 
32900 61 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61  aTo, aFrom and a
32910 53 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20  SortCost[] */.  
32920 6e 53 70 61 63 65 20 3d 20 28 73 69 7a 65 6f 66  nSpace = (sizeof
32930 28 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65  (WherePath)+size
32940 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e  of(WhereLoop*)*n
32950 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32  Loop)*mxChoice*2
32960 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 69  ;.  nSpace += si
32970 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e  zeof(LogEst) * n
32980 4f 72 64 65 72 42 79 3b 0a 20 20 70 53 70 61 63  OrderBy;.  pSpac
32990 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
329a0 6c 6f 63 52 61 77 28 64 62 2c 20 6e 53 70 61 63  locRaw(db, nSpac
329b0 65 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65  e);.  if( pSpace
329c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
329d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f  ITE_NOMEM;.  aTo
329e0 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70   = (WherePath*)p
329f0 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d  Space;.  aFrom =
32a00 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20   aTo+mxChoice;. 
32a10 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30   memset(aFrom, 0
32a20 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30  , sizeof(aFrom[0
32a30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65  ]));.  pX = (Whe
32a40 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b  reLoop**)(aFrom+
32a50 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72  mxChoice);.  for
32a60 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20  (ii=mxChoice*2, 
32a70 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b  pFrom=aTo; ii>0;
32a80 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20   ii--, pFrom++, 
32a90 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20  pX += nLoop){.  
32aa0 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d    pFrom->aLoop =
32ab0 20 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   pX;.  }.  if( n
32ac0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f  OrderBy ){.    /
32ad0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
32ae0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
32af0 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 62   and it is not b
32b00 65 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73 65  eing ignored, se
32b10 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61 63  t up.    ** spac
32b20 65 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74 43  e for the aSortC
32b30 6f 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61 63  ost[] array. Eac
32b40 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  h element of the
32b50 20 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61 79   aSortCost array
32b60 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65  .    ** is eithe
32b70 72 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67  r zero - meaning
32b80 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20   it has not yet 
32b90 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
32ba0 20 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a   - or the.    **
32bb0 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
32bc0 20 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f 66   nRowEst rows of
32bd0 20 64 61 74 61 20 77 68 65 72 65 20 74 68 65 20   data where the 
32be0 66 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f 66  first X terms of
32bf0 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  .    ** the ORDE
32c00 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
32c10 61 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65 72  already in order
32c20 2c 20 77 68 65 72 65 20 58 20 69 73 20 74 68 65  , where X is the
32c30 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 69   array .    ** i
32c40 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53  ndex.  */.    aS
32c50 6f 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73  ortCost = (LogEs
32c60 74 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65  t*)pX;.    memse
32c70 74 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20  t(aSortCost, 0, 
32c80 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a  sizeof(LogEst) *
32c90 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a   nOrderBy);.  }.
32ca0 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43    assert( aSortC
32cb0 6f 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63  ost==0 || &pSpac
32cc0 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72  e[nSpace]==(char
32cd0 2a 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72  *)&aSortCost[nOr
32ce0 64 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73 65  derBy] );.  asse
32cf0 72 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d 30  rt( aSortCost!=0
32d00 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61   || &pSpace[nSpa
32d10 63 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20 29  ce]==(char*)pX )
32d20 3b 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65  ;..  /* Seed the
32d30 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73   search with a s
32d40 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20  ingle WherePath 
32d50 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20  containing zero 
32d60 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a  WhereLoops..  **
32d70 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f  .  ** TUNING: Do
32d80 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d   not let the num
32d90 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
32da0 73 20 67 6f 20 61 62 6f 76 65 20 32 35 2e 20 20  s go above 25.  
32db0 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a  If the cost.  **
32dc0 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e   of computing an
32dd0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
32de0 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63   is not paid bac
32df0 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  k within the fir
32e00 73 74 20 32 35 0a 20 20 2a 2a 20 72 6f 77 73 2c  st 25.  ** rows,
32e10 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65   then do not use
32e20 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
32e30 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d  ndex. */.  aFrom
32e40 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70  [0].nRow = MIN(p
32e50 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
32e60 70 2c 20 34 36 29 3b 20 20 61 73 73 65 72 74 28  p, 46);  assert(
32e70 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   46==sqlite3LogE
32e80 73 74 28 32 35 29 20 29 3b 0a 20 20 6e 46 72 6f  st(25) );.  nFro
32e90 6d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  m = 1;.  assert(
32ea0 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65   aFrom[0].isOrde
32eb0 72 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  red==0 );.  if( 
32ec0 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
32ed0 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a  /* If nLoop is z
32ee0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ero, then there 
32ef0 61 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d  are no FROM term
32f00 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20  s in the query. 
32f10 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20  Since.    ** in 
32f20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 71 75  this case the qu
32f30 65 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20 61  ery may return a
32f40 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20   maximum of one 
32f50 72 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74 73  row, the results
32f60 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65  .    ** are alre
32f70 61 64 79 20 69 6e 20 74 68 65 20 72 65 71 75 65  ady in the reque
32f80 73 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74 20  sted order. Set 
32f90 69 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f 72  isOrdered to nOr
32fa0 64 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20  derBy to.    ** 
32fb0 69 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f  indicate this. O
32fc0 72 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67  r, if nLoop is g
32fd0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
32fe0 2c 20 73 65 74 20 69 73 4f 72 64 65 72 65 64 20  , set isOrdered 
32ff0 74 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e  to.    ** -1, in
33000 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68  dicating that th
33010 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61 79  e result set may
33020 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f   or may not be o
33030 72 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20  rdered, .    ** 
33040 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
33050 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f 20   loops added to 
33060 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61 6e  the current plan
33070 2e 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b  .  */.    aFrom[
33080 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e  0].isOrdered = n
33090 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f  Loop>0 ? -1 : nO
330a0 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f  rderBy;.  }..  /
330b0 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73  * Compute succes
330c0 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68  sively longer Wh
330d0 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74  erePaths using t
330e0 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65  he previous gene
330f0 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57  ration.  ** of W
33100 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65  herePaths as the
33110 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e   basis for the n
33120 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b  ext.  Keep track
33130 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65   of the mxChoice
33140 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73  .  ** best paths
33150 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74   at each generat
33160 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f  ion */.  for(iLo
33170 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  op=0; iLoop<nLoo
33180 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
33190 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f   nTo = 0;.    fo
331a0 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46  r(ii=0, pFrom=aF
331b0 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69  rom; ii<nFrom; i
331c0 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
331d0 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d       for(pWLoop=
331e0 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20  pWInfo->pLoops; 
331f0 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70  pWLoop; pWLoop=p
33200 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  WLoop->pNextLoop
33210 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  ){.        LogEs
33220 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20  t nOut;         
33230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33240 52 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  Rows visited by 
33250 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
33260 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  /.        LogEst
33270 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20   rCost;         
33280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
33290 6f 73 74 20 6f 66 20 70 61 74 68 20 28 70 46 72  ost of path (pFr
332a0 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
332b0 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55 6e        LogEst rUn
332c0 73 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  sorted;         
332d0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72          /* Unsor
332e0 74 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46 72  ted cost of (pFr
332f0 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
33300 20 20 20 20 20 20 69 38 20 69 73 4f 72 64 65 72        i8 isOrder
33310 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72  ed = pFrom->isOr
33320 64 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64  dered;  /* isOrd
33330 65 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b  ered for (pFrom+
33340 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20  pWLoop) */.     
33350 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e     Bitmask maskN
33360 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
33370 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
33380 73 72 63 20 76 69 73 69 74 65 64 20 62 79 20 28  src visited by (
33390 2e 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42  ..) */.        B
333a0 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d  itmask revMask =
333b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
333c0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d   /* Mask of rev-
333d0 6f 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20  order loops for 
333e0 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20  (..) */..       
333f0 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72   if( (pWLoop->pr
33400 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d  ereq & ~pFrom->m
33410 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
33420 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
33430 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73  if( (pWLoop->mas
33440 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d  kSelf & pFrom->m
33450 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
33460 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
33470 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
33480 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61  , pWLoop is a ca
33490 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68  ndidate to be th
334a0 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20  e next loop. .  
334b0 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65        ** Compute
334c0 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20   its cost */.   
334d0 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d       rUnsorted =
334e0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
334f0 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70  d(pWLoop->rSetup
33500 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20  ,pWLoop->rRun + 
33510 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20  pFrom->nRow);.  
33520 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20        rUnsorted 
33530 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
33540 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 70 46  dd(rUnsorted, pF
33550 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b  rom->rUnsorted);
33560 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20  .        nOut = 
33570 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57  pFrom->nRow + pW
33580 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20  Loop->nOut;.    
33590 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46      maskNew = pF
335a0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
335b0 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
335c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
335d0 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20 20  Ordered<0 ){.   
335e0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
335f0 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
33600 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
33610 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nfo,.           
33620 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
33630 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46  fo->pOrderBy, pF
33640 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74  rom, pWInfo->wct
33650 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  rlFlags,.       
33660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33670 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26  iLoop, pWLoop, &
33680 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20  revMask);.      
33690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
336a0 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72     revMask = pFr
336b0 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20  om->revLoop;.   
336c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
336d0 66 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  f( isOrdered>=0 
336e0 26 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72  && isOrdered<nOr
336f0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
33700 20 20 20 69 66 28 20 61 53 6f 72 74 43 6f 73 74     if( aSortCost
33710 5b 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29  [isOrdered]==0 )
33720 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53  {.            aS
33730 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
33740 64 5d 20 3d 20 77 68 65 72 65 53 6f 72 74 69 6e  d] = whereSortin
33750 67 43 6f 73 74 28 0a 20 20 20 20 20 20 20 20 20  gCost(.         
33760 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e         pWInfo, n
33770 52 6f 77 45 73 74 2c 20 6e 4f 72 64 65 72 42 79  RowEst, nOrderBy
33780 2c 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20  , isOrdered.    
33790 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
337a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
337b0 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33   rCost = sqlite3
337c0 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72  LogEstAdd(rUnsor
337d0 74 65 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69  ted, aSortCost[i
337e0 73 4f 72 64 65 72 65 64 5d 29 3b 0a 0a 20 20 20  sOrdered]);..   
337f0 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
33800 45 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20 20  E(0x002,.       
33810 20 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f         ("---- so
33820 72 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25 64  rt cost=%-3d (%d
33830 2f 25 64 29 20 69 6e 63 72 65 61 73 65 73 20 63  /%d) increases c
33840 6f 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64 5c  ost %3d to %-3d\
33850 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
33860 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f     aSortCost[isO
33870 72 64 65 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72  rdered], (nOrder
33880 42 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20 6e  By-isOrdered), n
33890 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20  OrderBy, .      
338a0 20 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74           rUnsort
338b0 65 64 2c 20 72 43 6f 73 74 29 29 3b 0a 20 20 20  ed, rCost));.   
338c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
338d0 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 72 55        rCost = rU
338e0 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20  nsorted;.       
338f0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   }..        /* C
33900 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
33910 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20  WLoop should be 
33920 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74  added to the set
33930 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d   of.        ** m
33940 78 43 68 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d  xChoice best-so-
33950 66 61 72 20 70 61 74 68 73 2e 0a 20 20 20 20 20  far paths..     
33960 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
33970 20 46 69 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20   First look for 
33980 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61 74 68  an existing path
33990 20 61 6d 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66   among best-so-f
339a0 61 72 20 70 61 74 68 73 0a 20 20 20 20 20 20 20  ar paths.       
339b0 20 2a 2a 20 74 68 61 74 20 63 6f 76 65 72 73 20   ** that covers 
339c0 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20  the same set of 
339d0 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68  loops and has th
339e0 65 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64  e same isOrdered
339f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 74  .        ** sett
33a00 69 6e 67 20 61 73 20 74 68 65 20 63 75 72 72 65  ing as the curre
33a10 6e 74 20 70 61 74 68 20 63 61 6e 64 69 64 61 74  nt path candidat
33a20 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e..        **.  
33a30 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 65 72        ** The ter
33a40 6d 20 22 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65  m "((pTo->isOrde
33a50 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30  red^isOrdered)&0
33a60 78 38 30 29 3d 3d 30 22 20 69 73 20 65 71 75 69  x80)==0" is equi
33a70 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  valent.        *
33a80 2a 20 74 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  * to (pTo->isOrd
33a90 65 72 65 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73  ered==(-1))==(is
33aa0 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 22 20  Ordered==(-1))" 
33ab0 66 6f 72 20 74 68 65 20 72 61 6e 67 65 0a 20 20  for the range.  
33ac0 20 20 20 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61        ** of lega
33ad0 6c 20 76 61 6c 75 65 73 20 66 6f 72 20 69 73 4f  l values for isO
33ae0 72 64 65 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a  rdered, -1..64..
33af0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
33b00 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f     for(jj=0, pTo
33b10 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a  =aTo; jj<nTo; jj
33b20 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
33b30 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d        if( pTo->m
33b40 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77  askLoop==maskNew
33b50 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
33b60 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e  (pTo->isOrdered^
33b70 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29  isOrdered)&0x80)
33b80 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ==0.          ){
33b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
33ba0 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31  tcase( jj==nTo-1
33bb0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
33bc0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
33bd0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
33be0 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f       if( jj>=nTo
33bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
33c00 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 69   None of the exi
33c10 73 74 69 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61  sting best-so-fa
33c20 72 20 70 61 74 68 73 20 6d 61 74 63 68 20 74 68  r paths match th
33c30 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a  e candidate. */.
33c40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54            if( nT
33c50 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a 20 20 20 20  o>=mxChoice.    
33c60 20 20 20 20 20 20 20 26 26 20 28 72 43 6f 73 74         && (rCost
33c70 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73  >mxCost || (rCos
33c80 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 72 55 6e  t==mxCost && rUn
33c90 73 6f 72 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74  sorted>=mxUnsort
33ca0 65 64 29 29 0a 20 20 20 20 20 20 20 20 20 20 29  ed)).          )
33cb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
33cc0 20 54 68 65 20 63 75 72 72 65 6e 74 20 63 61 6e   The current can
33cd0 64 69 64 61 74 65 20 69 73 20 6e 6f 20 62 65 74  didate is no bet
33ce0 74 65 72 20 74 68 61 6e 20 61 6e 79 20 6f 66 20  ter than any of 
33cf0 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 20  the mxChoice.   
33d00 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 74 68           ** path
33d10 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
33d20 68 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 62  he best-so-far b
33d30 75 66 66 65 72 2e 20 20 53 6f 20 64 69 73 63 61  uffer.  So disca
33d40 72 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  rd.            *
33d50 2a 20 74 68 69 73 20 63 61 6e 64 69 64 61 74 65  * this candidate
33d60 20 61 73 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20   as not viable. 
33d70 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  */.#ifdef WHERET
33d80 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
33d90 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
33da0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
33db0 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
33dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
33dd0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
33de0 28 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74  ("Skip   %s cost
33df0 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
33e00 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
33e10 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
33e20 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
33e30 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
33e40 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  ost, nOut,.     
33e50 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
33e60 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
33e70 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
33e80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
33e90 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
33ea0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
33eb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33ec0 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
33ed0 68 20 74 68 69 73 20 70 6f 69 6e 74 73 20 69 74  h this points it
33ee0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
33ef0 6e 65 77 20 63 61 6e 64 69 64 61 74 65 20 70 61  new candidate pa
33f00 74 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  th.          ** 
33f10 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64 64 65  needs to be adde
33f20 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20  d to the set of 
33f30 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68  best-so-far path
33f40 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
33f50 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65  if( nTo<mxChoice
33f60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
33f70 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  /* Increase the 
33f80 73 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20  size of the aTo 
33f90 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20  set by one */.  
33fa0 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e            jj = n
33fb0 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  To++;.          
33fc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
33fd0 20 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72     /* New path r
33fe0 65 70 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f  eplaces the prio
33ff0 72 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20  r worst to keep 
34000 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68  count below mxCh
34010 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  oice */.        
34020 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20      jj = mxI;.  
34030 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34040 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a      pTo = &aTo[j
34050 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45  j];.#ifdef WHERE
34060 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
34070 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
34080 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
34090 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
340a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
340b0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e  e3DebugPrintf("N
340c0 65 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  ew    %s cost=%-
340d0 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
340e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
340f0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
34100 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
34110 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
34120 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
34130 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
34140 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
34150 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
34160 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
34170 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34180 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f         /* Contro
34190 6c 20 72 65 61 63 68 65 73 20 68 65 72 65 20 69  l reaches here i
341a0 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61  f best-so-far pa
341b0 74 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63  th pTo=aTo[jj] c
341c0 6f 76 65 72 73 20 74 68 65 0a 20 20 20 20 20 20  overs the.      
341d0 20 20 20 20 2a 2a 20 73 61 6d 65 20 73 65 74 20      ** same set 
341e0 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73  of loops and has
341f0 20 74 68 65 20 73 61 6d 20 69 73 4f 72 64 65 72   the sam isOrder
34200 65 64 20 73 65 74 74 69 6e 67 20 61 73 20 74 68  ed setting as th
34210 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
34220 61 6e 64 69 64 61 74 65 20 70 61 74 68 2e 20 20  andidate path.  
34230 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
34240 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68  the candidate sh
34250 6f 75 6c 64 20 72 65 70 6c 61 63 65 0a 20 20 20  ould replace.   
34260 20 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 6f 72         ** pTo or
34270 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74   if the candidat
34280 65 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69 70  e should be skip
34290 70 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ped */.         
342a0 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c   if( pTo->rCost<
342b0 72 43 6f 73 74 20 7c 7c 20 28 70 54 6f 2d 3e 72  rCost || (pTo->r
342c0 43 6f 73 74 3d 3d 72 43 6f 73 74 20 26 26 20 70  Cost==rCost && p
342d0 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20  To->nRow<=nOut) 
342e0 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ){.#ifdef WHERET
342f0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
34300 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
34310 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
34320 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
34330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
34340 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
34350 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
34360 20 20 20 20 22 53 6b 69 70 20 20 20 25 73 20 63      "Skip   %s c
34370 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
34380 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
34390 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
343a0 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
343b0 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
343c0 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20  Cost, nOut,.    
343d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
343e0 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
343f0 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
34400 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
34410 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
34420 6e 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f  ntf("   vs %s co
34430 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65 72  st=%-3d,%d order
34440 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
34450 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
34460 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
34470 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
34480 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
34490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
344a0 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
344b0 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72  d>=0 ? pTo->isOr
344c0 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
344d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
344e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
344f0 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
34500 65 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68  e candidate path
34510 20 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f   from further co
34520 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  nsideration */. 
34530 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
34540 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d  ase( pTo->rCost=
34550 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20  =rCost );.      
34560 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
34570 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
34580 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
34590 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73  pTo->rCost==rCos
345a0 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  t+1 );.         
345b0 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63   /* Control reac
345c0 68 65 73 20 68 65 72 65 20 69 66 20 74 68 65 20  hes here if the 
345d0 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20 69  candidate path i
345e0 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68  s better than th
345f0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  e.          ** p
34600 54 6f 20 70 61 74 68 2e 20 20 52 65 70 6c 61 63  To path.  Replac
34610 65 20 70 54 6f 20 77 69 74 68 20 74 68 65 20 63  e pTo with the c
34620 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69 66  andidate. */.#if
34630 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
34640 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
34650 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
34660 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
34670 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
34680 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
34690 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
346a0 20 20 20 20 20 20 20 20 22 55 70 64 61 74 65 20          "Update 
346b0 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
346c0 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
346d0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
346e0 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
346f0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
34700 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20   rCost, nOut,.  
34710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
34720 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
34730 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
34740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
34750 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
34760 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74  f("  was %s cost
34770 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
34780 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
34790 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
347a0 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
347b0 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
347c0 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20  t, pTo->nRow,.  
347d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
347e0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  o->isOrdered>=0 
347f0 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ? pTo->isOrdered
34800 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20  +'0' : '?');.   
34810 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
34820 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34830 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61    /* pWLoop is a
34840 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74   winner.  Add it
34850 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62   to the set of b
34860 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  est so far */.  
34870 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c        pTo->maskL
34880 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73  oop = pFrom->mas
34890 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e  kLoop | pWLoop->
348a0 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
348b0 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d    pTo->revLoop =
348c0 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20   revMask;.      
348d0 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f    pTo->nRow = nO
348e0 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  ut;.        pTo-
348f0 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a  >rCost = rCost;.
34900 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e          pTo->rUn
34910 73 6f 72 74 65 64 20 3d 20 72 55 6e 73 6f 72 74  sorted = rUnsort
34920 65 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  ed;.        pTo-
34930 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f  >isOrdered = isO
34940 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20  rdered;.        
34950 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f  memcpy(pTo->aLoo
34960 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c  p, pFrom->aLoop,
34970 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
34980 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  p*)*iLoop);.    
34990 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69      pTo->aLoop[i
349a0 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a  Loop] = pWLoop;.
349b0 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e          if( nTo>
349c0 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20  =mxChoice ){.   
349d0 20 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a         mxI = 0;.
349e0 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74            mxCost
349f0 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b   = aTo[0].rCost;
34a00 0a 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73  .          mxUns
34a10 6f 72 74 65 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e  orted = aTo[0].n
34a20 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 66  Row;.          f
34a30 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54  or(jj=1, pTo=&aT
34a40 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63  o[1]; jj<mxChoic
34a50 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b  e; jj++, pTo++){
34a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
34a70 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f   pTo->rCost>mxCo
34a80 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
34a90 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d   || (pTo->rCost=
34aa0 3d 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e  =mxCost && pTo->
34ab0 72 55 6e 73 6f 72 74 65 64 3e 6d 78 55 6e 73 6f  rUnsorted>mxUnso
34ac0 72 74 65 64 29 20 0a 20 20 20 20 20 20 20 20 20  rted) .         
34ad0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
34ae0 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f      mxCost = pTo
34af0 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  ->rCost;.       
34b00 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65         mxUnsorte
34b10 64 20 3d 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74  d = pTo->rUnsort
34b20 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed;.            
34b30 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20    mxI = jj;.    
34b40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34b50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
34b60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23        }.    }..#
34b70 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
34b80 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32  _ENABLED  /* >=2
34b90 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
34ba0 74 65 33 57 68 65 72 65 54 72 61 63 65 3e 3d 32  te3WhereTrace>=2
34bb0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
34bc0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d  3DebugPrintf("--
34bd0 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25  -- after round %
34be0 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70  d ----\n", iLoop
34bf0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
34c00 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e  0, pTo=aTo; ii<n
34c10 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29  To; ii++, pTo++)
34c20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
34c30 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
34c40 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77  s cost=%-3d nrow
34c50 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  =%-3d order=%c",
34c60 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72  .           wher
34c70 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
34c80 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
34c90 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
34ca0 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  w,.           pT
34cb0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  o->isOrdered>=0 
34cc0 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  ? (pTo->isOrdere
34cd0 64 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a 20  d+'0') : '?');. 
34ce0 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
34cf0 69 73 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a 20  isOrdered>0 ){. 
34d00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
34d10 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65  DebugPrintf(" re
34d20 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f  v=0x%llx\n", pTo
34d30 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20  ->revLoop);.    
34d40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34d50 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
34d60 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
34d70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34d80 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
34d90 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72     /* Swap the r
34da0 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e  oles of aFrom an
34db0 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65  d aTo for the ne
34dc0 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  xt generation */
34dd0 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f  .    pFrom = aTo
34de0 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f  ;.    aTo = aFro
34df0 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70  m;.    aFrom = p
34e00 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20  From;.    nFrom 
34e10 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66  = nTo;.  }..  if
34e20 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20  ( nFrom==0 ){.  
34e30 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
34e40 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75  g(pParse, "no qu
34e50 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a  ery solution");.
34e60 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
34e70 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20  e(db, pSpace);. 
34e80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34e90 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20  _ERROR;.  }.  . 
34ea0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77   /* Find the low
34eb0 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20  est cost path.  
34ec0 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65  pFrom will be le
34ed0 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
34ee0 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46  hat path */.  pF
34ef0 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66  rom = aFrom;.  f
34f00 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f  or(ii=1; ii<nFro
34f10 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  m; ii++){.    if
34f20 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61  ( pFrom->rCost>a
34f30 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29  From[ii].rCost )
34f40 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b   pFrom = &aFrom[
34f50 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ii];.  }.  asser
34f60 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  t( pWInfo->nLeve
34f70 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a  l==nLoop );.  /*
34f80 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74   Load the lowest
34f90 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20   cost path into 
34fa0 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28  pWInfo */.  for(
34fb0 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e  iLoop=0; iLoop<n
34fc0 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
34fd0 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a      WhereLevel *
34fe0 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d  pLevel = pWInfo-
34ff0 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20  >a + iLoop;.    
35000 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d  pLevel->pWLoop =
35010 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d   pWLoop = pFrom-
35020 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20  >aLoop[iLoop];. 
35030 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d     pLevel->iFrom
35040 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b   = pWLoop->iTab;
35050 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61  .    pLevel->iTa
35060 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  bCur = pWInfo->p
35070 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
35080 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f  l->iFrom].iCurso
35090 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57  r;.  }.  if( (pW
350a0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
350b0 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
350c0 53 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26  STINCT)!=0.   &&
350d0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
350e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
350f0 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26  TINCTBY)==0.   &
35100 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  & pWInfo->eDisti
35110 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  nct==WHERE_DISTI
35120 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e  NCT_NOOP.   && n
35130 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20  RowEst.  ){.    
35140 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b  Bitmask notUsed;
35150 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68  .    int rc = wh
35160 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
35170 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20  OrderBy(pWInfo, 
35180 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
35190 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20  et, pFrom,.     
351a0 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
351b0 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c  E_DISTINCTBY, nL
351c0 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c  oop-1, pFrom->aL
351d0 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e  oop[nLoop-1], &n
351e0 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28  otUsed);.    if(
351f0 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52 65   rc==pWInfo->pRe
35200 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20 29  sultSet->nExpr )
35210 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
35220 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
35230 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
35240 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
35250 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
35260 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20  erBy ){.    if( 
35270 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
35280 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
35290 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20 69  NCTBY ){.      i
352a0 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65  f( pFrom->isOrde
352b0 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72  red==pWInfo->pOr
352c0 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
352d0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
352e0 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
352f0 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
35300 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ED;.      }.    
35310 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49  }else{.      pWI
35320 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 46  nfo->nOBSat = pF
35330 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a  rom->isOrdered;.
35340 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
35350 2d 3e 6e 4f 42 53 61 74 3c 30 20 29 20 70 57 49  ->nOBSat<0 ) pWI
35360 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b  nfo->nOBSat = 0;
35370 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  .      pWInfo->r
35380 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
35390 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20  revLoop;.    }. 
353a0 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
353b0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
353c0 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29 0a  RE_SORTBYGROUP).
353d0 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66          && pWInf
353e0 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e 66  o->nOBSat==pWInf
353f0 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
35400 70 72 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  pr.    ){.      
35410 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 20  Bitmask notUsed 
35420 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  = 0;.      int n
35430 4f 72 64 65 72 20 3d 20 77 68 65 72 65 50 61 74  Order = wherePat
35440 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
35450 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  y(pWInfo, pWInfo
35460 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20  ->pOrderBy, .   
35470 20 20 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c         pFrom, 0,
35480 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d   nLoop-1, pFrom-
35490 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c  >aLoop[nLoop-1],
354a0 20 26 6e 6f 74 55 73 65 64 0a 20 20 20 20 20 20   &notUsed.      
354b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
354c0 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d   pWInfo->sorted=
354d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  =0 );.      pWIn
354e0 66 6f 2d 3e 73 6f 72 74 65 64 20 3d 20 28 6e 4f  fo->sorted = (nO
354f0 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  rder==pWInfo->pO
35500 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 29 3b 0a  rderBy->nExpr);.
35510 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57      }.  }...  pW
35520 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20  Info->nRowOut = 
35530 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20  pFrom->nRow;..  
35540 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72  /* Free temporar
35550 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74  y memory and ret
35560 75 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20  urn success */. 
35570 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
35580 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65  b, pSpace);.  re
35590 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
355a0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75  }../*.** Most qu
355b0 65 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61  eries use only a
355c0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74   single table (t
355d0 68 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e  hey are not join
355e0 73 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73  s) and have.** s
355f0 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61  imple == constra
35600 69 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64  ints against ind
35610 65 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68  exed fields.  Th
35620 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
35630 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74  pts.** to plan t
35640 68 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65  hose simple case
35650 73 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73  s using much les
35660 73 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20  s ceremony than 
35670 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70  the.** general-p
35680 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61  urpose query pla
35690 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62  nner, and thereb
356a0 79 20 79 69 65 6c 64 20 66 61 73 74 65 72 20 73  y yield faster s
356b0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29  qlite3_prepare()
356c0 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68  .** times for th
356d0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a  e common case..*
356e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
356f0 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c  zero on success,
35700 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20 63   if this query c
35710 61 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79  an be handled by
35720 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c   this.** no-fril
35730 6c 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  ls query planner
35740 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69  .  Return zero i
35750 66 20 74 68 69 73 20 71 75 65 72 79 20 6e 65 65  f this query nee
35760 64 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72  ds the .** gener
35770 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79  al-purpose query
35780 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61   planner..*/.sta
35790 74 69 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f  tic int whereSho
357a0 72 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42  rtCut(WhereLoopB
357b0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
357c0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
357d0 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  pWInfo;.  struct
357e0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
357f0 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61  Item;.  WhereCla
35800 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72  use *pWC;.  Wher
35810 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
35820 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
35830 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20  ;.  int iCur;.  
35840 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a  int j;.  Table *
35850 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pTab;.  Index *p
35860 49 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f  Idx;.  .  pWInfo
35870 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
35880 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  nfo;.  if( pWInf
35890 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
358a0 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c  WHERE_FORCE_TABL
358b0 45 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  E ) return 0;.  
358c0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
358d0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d  pTabList->nSrc>=
358e0 31 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70  1 );.  pItem = p
358f0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
35900 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74  >a;.  pTab = pIt
35910 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20  em->pTab;.  if( 
35920 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
35930 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
35940 28 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20  ( pItem->zIndex 
35950 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43  ) return 0;.  iC
35960 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  ur = pItem->iCur
35970 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57  sor;.  pWC = &pW
35980 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f  Info->sWC;.  pLo
35990 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  op = pBuilder->p
359a0 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  New;.  pLoop->ws
359b0 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f  Flags = 0;.  pLo
359c0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  op->u.btree.nSki
359d0 70 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d  p = 0;.  pTerm =
359e0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
359f0 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45  Cur, -1, 0, WO_E
35a00 51 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65  Q, 0);.  if( pTe
35a10 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d  rm ){.    pLoop-
35a20 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
35a30 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
35a40 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f  _IPK|WHERE_ONERO
35a50 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c  W;.    pLoop->aL
35a60 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
35a70 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  .    pLoop->nLTe
35a80 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f  rm = 1;.    pLoo
35a90 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  p->u.btree.nEq =
35aa0 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e   1;.    /* TUNIN
35ab0 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f 77  G: Cost of a row
35ac0 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20  id lookup is 10 
35ad0 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52  */.    pLoop->rR
35ae0 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d  un = 33;  /* 33=
35af0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
35b00 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  0) */.  }else{. 
35b10 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
35b20 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
35b30 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
35b40 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
35b50 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70   pLoop->aLTermSp
35b60 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65  ace==pLoop->aLTe
35b70 72 6d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  rm );.      asse
35b80 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 4c  rt( ArraySize(pL
35b90 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  oop->aLTermSpace
35ba0 29 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 69 66  )==4 );.      if
35bb0 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78  ( !IsUniqueIndex
35bc0 28 70 49 64 78 29 0a 20 20 20 20 20 20 20 7c 7c  (pIdx).       ||
35bd0 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
35be0 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20 20  here!=0 .       
35bf0 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  || pIdx->nKeyCol
35c00 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70  >ArraySize(pLoop
35c10 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20 0a  ->aLTermSpace) .
35c20 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75 65        ) continue
35c30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
35c40 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   j<pIdx->nKeyCol
35c50 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
35c60 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
35c70 28 70 57 43 2c 20 69 43 75 72 2c 20 70 49 64 78  (pWC, iCur, pIdx
35c80 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30  ->aiColumn[j], 0
35c90 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 3b 0a  , WO_EQ, pIdx);.
35ca0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
35cb0 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
35cc0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54        pLoop->aLT
35cd0 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[j] = pTerm;.
35ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
35cf0 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ( j!=pIdx->nKeyC
35d00 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ol ) continue;. 
35d10 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c       pLoop->wsFl
35d20 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
35d30 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52  MN_EQ|WHERE_ONER
35d40 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44  OW|WHERE_INDEXED
35d50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
35d60 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20  ->isCovering || 
35d70 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  (pItem->colUsed 
35d80 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  & ~columnsInInde
35d90 78 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20  x(pIdx))==0 ){. 
35da0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73         pLoop->ws
35db0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49  Flags |= WHERE_I
35dc0 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  DX_ONLY;.      }
35dd0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  .      pLoop->nL
35de0 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  Term = j;.      
35df0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
35e00 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c  Eq = j;.      pL
35e10 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
35e20 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  dex = pIdx;.    
35e30 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
35e40 74 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e  t of a unique in
35e50 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35  dex lookup is 15
35e60 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   */.      pLoop-
35e70 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20  >rRun = 39;  /* 
35e80 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  39==sqlite3LogEs
35e90 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62  t(15) */.      b
35ea0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
35eb0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
35ec0 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f  lags ){.    pLoo
35ed0 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73  p->nOut = (LogEs
35ee0 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  t)1;.    pWInfo-
35ef0 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70  >a[0].pWLoop = p
35f00 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  Loop;.    pLoop-
35f10 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d  >maskSelf = getM
35f20 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
35f30 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20  skSet, iCur);.  
35f40 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69    pWInfo->a[0].i
35f50 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  TabCur = iCur;. 
35f60 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f     pWInfo->nRowO
35f70 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ut = 1;.    if( 
35f80 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
35f90 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61   ) pWInfo->nOBSa
35fa0 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  t =  pWInfo->pOr
35fb0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
35fc0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
35fd0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
35fe0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
35ff0 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
36000 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
36010 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
36020 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  E;.    }.#ifdef 
36030 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
36040 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30   pLoop->cId = '0
36050 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  ';.#endif.    re
36060 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
36070 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
36080 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65   Generate the be
36090 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c  ginning of the l
360a0 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45  oop used for WHE
360b0 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
360c0 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74  sing..** The ret
360d0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70  urn value is a p
360e0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61  ointer to an opa
360f0 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68  que structure th
36100 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69  at contains.** i
36110 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65  nformation neede
36120 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  d to terminate t
36130 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c  he loop.  Later,
36140 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
36150 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69  tine.** should i
36160 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65  nvoke sqlite3Whe
36170 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65  reEnd() with the
36180 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
36190 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
361a0 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
361b0 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45  mplete the WHERE
361c0 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
361d0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
361e0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
361f0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
36200 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  ns NULL..**.** T
36210 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73  he basic idea is
36220 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20   to do a nested 
36230 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66  loop, one loop f
36240 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
36250 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
36260 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e  use of a select.
36270 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50    (INSERT and UP
36280 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20  DATE statements 
36290 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  are the.** same 
362a0 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68  as a SELECT with
362b0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
362c0 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
362d0 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a   clause.)  For.*
362e0 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  * example, if th
362f0 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a  e SQL is this:.*
36300 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43  *.**       SELEC
36310 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c  T * FROM t1, t2,
36320 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a   t3 WHERE ...;.*
36330 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f  *.** Then the co
36340 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20  de generated is 
36350 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b  conceptually lik
36360 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  e the following:
36370 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  .**.**      fore
36380 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
36390 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64  o       \    Cod
363a0 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
363b0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
363c0 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20  w2 in t2 do     
363d0 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
363e0 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20  hereBegin().**  
363f0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
36400 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20  row3 in t3 do   
36410 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
36420 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
36430 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
36440 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64          \    Cod
36450 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
36460 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
36470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36480 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
36490 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20  hereEnd().**    
364a0 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
364b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a                /.
364c0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
364d0 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20  the loops might 
364e0 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e  not be nested in
364f0 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68   the order in wh
36500 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65  ich they.** appe
36510 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
36520 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65  lause if a diffe
36530 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65  rent order is be
36540 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b  tter able to mak
36550 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69  e.** use of indi
36560 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20  ces.  Note also 
36570 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e  that when the IN
36580 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72   operator appear
36590 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52  s in.** the WHER
365a0 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67  E clause, it mig
365b0 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64  ht result in add
365c0 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c  itional nested l
365d0 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e  oops for.** scan
365e0 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c  ning through all
365f0 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72   values on the r
36600 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
36610 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20  f the IN..**.** 
36620 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20  There are Btree 
36630 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
36640 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62  ed with each tab
36650 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72  le.  t1 uses cur
36660 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54  sor.** number pT
36670 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75  abList->a[0].iCu
36680 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74  rsor.  t2 uses t
36690 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69  he cursor pTabLi
366a0 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72  st->a[1].iCursor
366b0 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74  ..** And so fort
366c0 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  h.  This routine
366d0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
366e0 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44  to open those VD
366f0 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e  BE cursors.** an
36700 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
36710 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68  d() generates th
36720 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20  e code to close 
36730 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  them..**.** The 
36740 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65  code that sqlite
36750 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65  3WhereBegin() ge
36760 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74  nerates leaves t
36770 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64  he cursors named
36780 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20  .** in pTabList 
36790 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69  pointing at thei
367a0 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e  r appropriate en
367b0 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e  tries.  The [...
367c0 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73  ] code.** can us
367d0 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20  e OP_Column and 
367e0 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73  OP_Rowid opcodes
367f0 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72   on these cursor
36800 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20  s to extract.** 
36810 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61  data from the va
36820 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20  rious tables of 
36830 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
36840 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
36850 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  use is empty, th
36860 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20  e foreach loops 
36870 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74  must each scan t
36880 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74  heir.** entire t
36890 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74  ables.  Thus a t
368a0 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73  hree-way join is
368b0 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61   an O(N^3) opera
368c0 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a  tion.  But if.**
368d0 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65   the tables have
368e0 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65   indices and the
368f0 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20  re are terms in 
36900 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
36910 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74   that.** refer t
36920 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c  o those indices,
36930 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c   a complete tabl
36940 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76  e scan can be av
36950 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  oided and the.**
36960 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d   code will run m
36970 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73  uch faster.  Mos
36980 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66  t of the work of
36990 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
369a0 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20   checking.** to 
369b0 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
369c0 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61   indices that ca
369d0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65  n be used to spe
369e0 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a  ed up the loop..
369f0 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74  **.** Terms of t
36a00 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
36a10 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f  are also used to
36a20 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77   limit which row
36a30 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61  s actually.** ma
36a40 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e  ke it to the "..
36a50 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ." in the middle
36a60 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41   of the loop.  A
36a70 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61  fter each "forea
36a80 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66  ch",.** terms of
36a90 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
36aa0 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20  e that use only 
36ab0 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f  terms in that lo
36ac0 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20  op and outer.** 
36ad0 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61  loops are evalua
36ae0 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65  ted and if false
36af0 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20   a jump is made 
36b00 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65  around all subse
36b10 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c  quent.** inner l
36b20 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20  oops (or around 
36b30 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65  the "..." if the
36b40 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74   test occurs wit
36b50 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a  hin the inner-.*
36b60 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a  * most loop).**.
36b70 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a  ** OUTER JOINS.*
36b80 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f  *.** An outer jo
36b90 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20  in of tables t1 
36ba0 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70  and t2 is concep
36bb0 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66  tally coded as f
36bc0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
36bd0 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
36be0 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66   t1 do.**      f
36bf0 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20  lag = 0.**      
36c00 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
36c10 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20  t2 do.**        
36c20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20  start:.**       
36c30 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
36c40 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20     flag = 1.**  
36c50 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20      end.**      
36c60 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a  if flag==0 then.
36c70 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74  **        move t
36c80 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74  he row2 cursor t
36c90 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20  o a null row.** 
36ca0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72         goto star
36cb0 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20  t.**      fi.** 
36cc0 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44     end.**.** ORD
36cd0 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f  ER BY CLAUSE PRO
36ce0 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f  CESSING.**.** pO
36cf0 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e  rderBy is a poin
36d00 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52  ter to the ORDER
36d10 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72 20 74   BY clause (or t
36d20 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
36d30 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45  se.** if the WHE
36d40 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20  RE_GROUPBY flag 
36d50 69 73 20 73 65 74 20 69 6e 20 77 63 74 72 6c 46  is set in wctrlF
36d60 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c 45 43  lags) of a SELEC
36d70 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69  T statement.** i
36d80 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
36d90 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
36da0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
36db0 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  or if this routi
36dc0 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
36dd0 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f  from an UPDATE o
36de0 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
36df0 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42  nt, then pOrderB
36e00 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  y is NULL..**.**
36e10 20 54 68 65 20 69 49 64 78 43 75 72 20 70 61 72   The iIdxCur par
36e20 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 63 75  ameter is the cu
36e30 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61  rsor number of a
36e40 6e 20 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a  n index.  If .**
36e50 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
36e60 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 49 64  ONLY is set, iId
36e70 78 43 75 72 20 69 73 20 74 68 65 20 63 75 72 73  xCur is the curs
36e80 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  or number of an 
36e90 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20  index.** to use 
36ea0 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72  for OR clause pr
36eb0 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 20 57  ocessing.  The W
36ec0 48 45 52 45 20 63 6c 61 75 73 65 20 73 68 6f 75  HERE clause shou
36ed0 6c 64 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 73  ld use this.** s
36ee0 70 65 63 69 66 69 63 20 63 75 72 73 6f 72 2e 20  pecific cursor. 
36ef0 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 50 41 53   If WHERE_ONEPAS
36f00 53 5f 44 45 53 49 52 45 44 20 69 73 20 73 65 74  S_DESIRED is set
36f10 2c 20 74 68 65 6e 20 69 49 64 78 43 75 72 20 69  , then iIdxCur i
36f20 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  s.** the first c
36f30 75 72 73 6f 72 20 69 6e 20 61 6e 20 61 72 72 61  ursor in an arra
36f40 79 20 6f 66 20 63 75 72 73 6f 72 73 20 66 6f 72  y of cursors for
36f50 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20 69   all indices.  i
36f60 49 64 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a  IdxCur should.**
36f70 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   be used to comp
36f80 75 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ute the appropri
36f90 61 74 65 20 63 75 72 73 6f 72 20 64 65 70 65 6e  ate cursor depen
36fa0 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69 6e  ding on which in
36fb0 64 65 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a  dex is.** used..
36fc0 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
36fd0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
36fe0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
36ff0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
37000 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
37010 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
37020 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f  bList,    /* FRO
37030 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74  M clause: A list
37040 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74   of all tables t
37050 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
37060 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
37070 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
37080 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
37090 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
370a0 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44  rBy,   /* An ORD
370b0 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
370c0 42 59 29 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e  BY) clause, or N
370d0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
370e0 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 2f  t *pResultSet, /
370f0 2a 20 52 65 73 75 6c 74 20 73 65 74 20 6f 66 20  * Result set of 
37100 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 75  the query */.  u
37110 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
37120 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
37130 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
37140 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
37150 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74  teInt.h */.  int
37160 20 69 49 64 78 43 75 72 20 20 20 20 20 20 20 20   iIdxCur        
37170 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f     /* If WHERE_O
37180 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20  NETABLE_ONLY is 
37190 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f  set, index curso
371a0 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  r number */.){. 
371b0 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b   int nByteWInfo;
371c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
371d0 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  um. bytes alloca
371e0 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66  ted for WhereInf
371f0 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e  o struct */.  in
37200 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20  t nTabList;     
37210 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
37220 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
37230 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  n pTabList */.  
37240 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
37250 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69  o;         /* Wi
37260 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65  ll become the re
37270 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
37280 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
37290 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
372a0 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54  e->pVdbe;   /* T
372b0 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62  he virtual datab
372c0 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20  ase engine */.  
372d0 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
372e0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ;          /* Cu
372f0 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
37300 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65  ot yet positione
37310 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  d */.  WhereLoop
37320 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20  Builder sWLB;   
37330 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
37340 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20  op builder */.  
37350 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
37360 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68  askSet;    /* Th
37370 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73  e expression mas
37380 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65  k set */.  Where
37390 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
373a0 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
373b0 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66  e level in pWInf
373c0 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  o->a[] */.  Wher
373d0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
373e0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
373f0 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68  r to a single Wh
37400 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
37410 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  /.  int ii;     
37420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37430 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
37440 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
37450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37460 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
37470 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
37480 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
37490 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
374a0 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56  code */...  /* V
374b0 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69  ariable initiali
374c0 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d  zation */.  db =
374d0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d   pParse->db;.  m
374e0 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20  emset(&sWLB, 0, 
374f0 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a  sizeof(sWLB));..
37500 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52    /* An ORDER/GR
37510 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 6f 66  OUP BY clause of
37520 20 6d 6f 72 65 20 74 68 61 6e 20 36 33 20 74 65   more than 63 te
37530 72 6d 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  rms cannot be op
37540 74 69 6d 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73  timized */.  tes
37550 74 63 61 73 65 28 20 70 4f 72 64 65 72 42 79 20  tcase( pOrderBy 
37560 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  && pOrderBy->nEx
37570 70 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69  pr==BMS-1 );.  i
37580 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70  f( pOrderBy && p
37590 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d  OrderBy->nExpr>=
375a0 42 4d 53 20 29 20 70 4f 72 64 65 72 42 79 20 3d  BMS ) pOrderBy =
375b0 20 30 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65   0;.  sWLB.pOrde
375c0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
375d0 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68  .  /* Disable th
375e0 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d  e DISTINCT optim
375f0 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54  ization if SQLIT
37600 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73  E_DistinctOpt is
37610 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71   set via.  ** sq
37620 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28  lite3_test_ctrl(
37630 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
37640 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e  OPTIMIZATIONS,..
37650 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  .) */.  if( Opti
37660 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
37670 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74  (db, SQLITE_Dist
37680 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20  inctOpt) ){.    
37690 77 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57  wctrlFlags &= ~W
376a0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
376b0 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  CT;.  }..  /* Th
376c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  e number of tabl
376d0 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
376e0 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
376f0 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
37700 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61  f.  ** bits in a
37710 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20   Bitmask .  */. 
37720 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 4c   testcase( pTabL
37730 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29  ist->nSrc==BMS )
37740 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  ;.  if( pTabList
37750 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20  ->nSrc>BMS ){.  
37760 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
37770 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f  g(pParse, "at mo
37780 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20  st %d tables in 
37790 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20  a join", BMS);. 
377a0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
377b0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
377c0 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65  tion normally ge
377d0 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74 65 64  nerates a nested
377e0 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61   loop for all ta
377f0 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54  bles in .  ** pT
37800 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20  abList.  But if 
37810 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  the WHERE_ONETAB
37820 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20  LE_ONLY flag is 
37830 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f  set, then we sho
37840 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65  uld.  ** only ge
37850 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
37860 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20  the first table 
37870 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20  in pTabList and 
37880 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a  assume that.  **
37890 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73   any cursors ass
378a0 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 75 62  ociated with sub
378b0 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61  sequent tables a
378c0 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  re uninitialized
378d0 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73  ..  */.  nTabLis
378e0 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20  t = (wctrlFlags 
378f0 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
37900 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61  _ONLY) ? 1 : pTa
37910 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20  bList->nSrc;..  
37920 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
37930 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57  initialize the W
37940 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
37950 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  re that will bec
37960 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74  ome the.  ** ret
37970 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e  urn value. A sin
37980 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  gle allocation i
37990 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
379a0 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20  the WhereInfo.  
379b0 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20 63  ** struct, the c
379c0 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65  ontents of Where
379d0 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68  Info.a[], the Wh
379e0 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
379f0 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ure.  ** and the
37a00 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
37a10 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57  ructure. Since W
37a20 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61  hereClause conta
37a30 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20  ins an 8-byte.  
37a40 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20 42  ** field (type B
37a50 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20  itmask) it must 
37a60 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e  be aligned on an
37a70 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79   8-byte boundary
37a80 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72   on.  ** some ar
37a90 63 68 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e  chitectures. Hen
37aa0 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20  ce the ROUND8() 
37ab0 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42  below..  */.  nB
37ac0 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44  yteWInfo = ROUND
37ad0 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e  8(sizeof(WhereIn
37ae0 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29  fo)+(nTabList-1)
37af0 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76  *sizeof(WhereLev
37b00 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  el));.  pWInfo =
37b10 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
37b20 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 57 49  Zero(db, nByteWI
37b30 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65  nfo + sizeof(Whe
37b40 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20  reLoop));.  if( 
37b50 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
37b60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
37b70 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
37b80 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  );.    pWInfo = 
37b90 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  0;.    goto wher
37ba0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
37bb0 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  .  pWInfo->aiCur
37bc0 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 57 49  OnePass[0] = pWI
37bd0 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
37be0 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49  s[1] = -1;.  pWI
37bf0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54  nfo->nLevel = nT
37c00 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
37c10 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
37c20 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
37c30 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
37c40 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  ;.  pWInfo->pOrd
37c50 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
37c60 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  .  pWInfo->pResu
37c70 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53  ltSet = pResultS
37c80 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  et;.  pWInfo->iB
37c90 72 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69  reak = pWInfo->i
37ca0 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
37cb0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
37cc0 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63  v);.  pWInfo->wc
37cd0 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c  trlFlags = wctrl
37ce0 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d  Flags;.  pWInfo-
37cf0 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
37d00 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
37d10 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65  yLoop;.  pMaskSe
37d20 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  t = &pWInfo->sMa
37d30 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57  skSet;.  sWLB.pW
37d40 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20  Info = pWInfo;. 
37d50 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49   sWLB.pWC = &pWI
37d60 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42  nfo->sWC;.  sWLB
37d70 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f  .pNew = (WhereLo
37d80 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57 49  op*)(((char*)pWI
37d90 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29  nfo)+nByteWInfo)
37da0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
37db0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
37dc0 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20  (sWLB.pNew) );. 
37dd0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73   whereLoopInit(s
37de0 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65  WLB.pNew);.#ifde
37df0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
37e00 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20   sWLB.pNew->cId 
37e10 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20  = '*';.#endif.. 
37e20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48   /* Split the WH
37e30 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20  ERE clause into 
37e40 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72  separate subexpr
37e50 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61  essions where ea
37e60 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65  ch.  ** subexpre
37e70 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
37e80 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65  ed by an AND ope
37e90 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e  rator..  */.  in
37ea0 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53  itMaskSet(pMaskS
37eb0 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75  et);.  whereClau
37ec0 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e  seInit(&pWInfo->
37ed0 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  sWC, pWInfo);.  
37ee0 77 68 65 72 65 53 70 6c 69 74 28 26 70 57 49 6e  whereSplit(&pWIn
37ef0 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72 65 2c  fo->sWC, pWhere,
37f00 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20   TK_AND);.    . 
37f10 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
37f20 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  : a WHERE clause
37f30 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e   that is constan
37f40 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65  t.  Evaluate the
37f50 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
37f60 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70   and either jump
37f70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65   over all of the
37f80 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68   code or fall th
37f90 72 75 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ru..  */.  for(i
37fa0 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43  i=0; ii<sWLB.pWC
37fb0 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a  ->nTerm; ii++){.
37fc0 20 20 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74      if( nTabList
37fd0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78  ==0 || sqlite3Ex
37fe0 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
37ff0 6f 69 6e 28 73 57 4c 42 2e 70 57 43 2d 3e 61 5b  oin(sWLB.pWC->a[
38000 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  ii].pExpr) ){.  
38010 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
38020 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 73  fFalse(pParse, s
38030 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70  WLB.pWC->a[ii].p
38040 45 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  Expr, pWInfo->iB
38050 72 65 61 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  reak,.          
38060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
38070 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
38080 29 3b 0a 20 20 20 20 20 20 73 57 4c 42 2e 70 57  );.      sWLB.pW
38090 43 2d 3e 61 5b 69 69 5d 2e 77 74 46 6c 61 67 73  C->a[ii].wtFlags
380a0 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
380b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
380c0 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f  Special case: No
380d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
380e0 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74  /.  if( nTabList
380f0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
38100 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f  OrderBy ) pWInfo
38110 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f 72 64 65  ->nOBSat = pOrde
38120 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
38130 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
38140 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
38150 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57  INCT ){.      pW
38160 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
38170 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
38180 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20  _UNIQUE;.    }. 
38190 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20   }..  /* Assign 
381a0 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62  a bit from