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

Artifact b3be5eb4193b6327c4a02fe91411df503fe770e8:


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 3d 70 49 64 78 2d 3e 6e 4b 65 79  ER(j>=pIdx->nKey
45f0: 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Col) ) return 0;
4600: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e  .    }.    pScan
4610: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49  ->zCollName = pI
4620: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  dx->azColl[j];. 
4630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61   }else{.    pSca
4640: 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20  n->idxaff = 0;. 
4650: 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e     pScan->zCollN
4660: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  ame = 0;.  }.  p
4670: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f  Scan->opMask = o
4680: 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e  pMask;.  pScan->
4690: 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e  k = 0;.  pScan->
46a0: 61 45 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72  aEquiv[0] = iCur
46b0: 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  ;.  pScan->aEqui
46c0: 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a  v[1] = iColumn;.
46d0: 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20    pScan->nEquiv 
46e0: 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45  = 2;.  pScan->iE
46f0: 71 75 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75  quiv = 2;.  retu
4700: 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74  rn whereScanNext
4710: 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pScan);.}../*.*
4720: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74  * Search for a t
4730: 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
4740: 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20   clause that is 
4750: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
4760: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77  op> <expr>".** w
4770: 68 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65  here X is a refe
4780: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f  rence to the iCo
4790: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43  lumn of table iC
47a0: 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  ur and <op> is o
47b0: 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f  ne of.** the WO_
47c0: 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65  xx operator code
47d0: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
47e0: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
47f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
4800: 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d  nter to the term
4810: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
4820: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  ot found..**.** 
4830: 54 68 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65  The term returne
4840: 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78  d might by Y=<ex
4850: 70 72 3e 20 69 66 20 74 68 65 72 65 20 69 73 20  pr> if there is 
4860: 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69  another constrai
4870: 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45  nt in.** the WHE
4880: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 73  RE clause that s
4890: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 58 3d  pecifies that X=
48a0: 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e  Y.  Any such con
48b0: 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65  straints will be
48c0: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62  .** identified b
48d0: 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62  y the WO_EQUIV b
48e0: 69 74 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d  it in the pTerm-
48f0: 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64  >eOperator field
4900: 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76  .  The.** aEquiv
4910: 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58  [] array holds X
4920: 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75   and all its equ
4930: 69 76 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65  ivalents, with e
4940: 61 63 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65  ach SQL variable
4950: 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77  .** taking up tw
4960: 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69  o slots in aEqui
4970: 76 5b 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20  v[].  The first 
4980: 73 6c 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20  slot is for the 
4990: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a  cursor number.**
49a0: 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
49b0: 69 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  is for the colum
49c0: 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65  n number.  There
49d0: 20 61 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e   are 22 slots in
49e0: 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20   aEquiv[].** so 
49f0: 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61  that means we ca
4a00: 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75  n look for X plu
4a10: 73 20 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72  s up to 10 other
4a20: 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75   equivalent valu
4a30: 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73  es..** Hence a s
4a40: 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c  earch for X will
4a50: 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69   return <expr> i
4a60: 66 20 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32  f X=A1 and A1=A2
4a70: 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e   and A2=A3.** an
4a80: 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30  d ... and A9=A10
4a90: 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e   and A10=<expr>.
4aa0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
4ab0: 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72  are multiple ter
4ac0: 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
4ad0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
4ae0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
4af0: 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66  >".** then try f
4b00: 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  or the one with 
4b10: 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  no dependencies 
4b20: 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f  on <expr> - in o
4b30: 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65  ther words where
4b40: 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20  .** <expr> is a 
4b50: 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
4b60: 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ion of some kind
4b70: 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65  .  Only return e
4b80: 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65  ntries of.** the
4b90: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22   form "X <op> Y"
4ba0: 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f   where Y is a co
4bb0: 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  lumn in another 
4bc0: 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d  table if no term
4bd0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
4be0: 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d   "X <op> <const-
4bf0: 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20  expr>" exist.   
4c00: 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68  If no terms with
4c10: 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a   a constant RHS.
4c20: 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f  ** exist, try to
4c30: 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74   return a term t
4c40: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
4c50: 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 73 74   WO_EQUIV..*/.st
4c60: 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a  atic WhereTerm *
4c70: 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72  findTerm(.  Wher
4c80: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
4c90: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
4ca0: 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72  lause to be sear
4cb0: 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ched */.  int iC
4cc0: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
4cd0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
4ce0: 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74   of LHS */.  int
4cf0: 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   iColumn,       
4d00: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
4d10: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
4d20: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
4d30: 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73  ,     /* RHS mus
4d40: 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69  t not overlap wi
4d50: 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a  th this mask */.
4d60: 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20    u32 op,       
4d70: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
4d80: 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20  of WO_xx values 
4d90: 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61  describing opera
4da0: 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  tor */.  Index *
4db0: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f  pIdx           /
4dc0: 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  * Must be compat
4dd0: 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69  ible with this i
4de0: 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c  ndex, if not NUL
4df0: 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  L */.){.  WhereT
4e00: 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30  erm *pResult = 0
4e10: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
4e20: 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63  ;.  WhereScan sc
4e30: 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65  an;..  p = where
4e40: 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20  ScanInit(&scan, 
4e50: 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75  pWC, iCur, iColu
4e60: 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20  mn, op, pIdx);. 
4e70: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
4e80: 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52   if( (p->prereqR
4e90: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
4ea0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
4eb0: 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d   p->prereqRight=
4ec0: 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61  =0 && (p->eOpera
4ed0: 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 29 7b  tor&WO_EQ)!=0 ){
4ee0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4ef0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
4f00: 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20   if( pResult==0 
4f10: 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20  ) pResult = p;. 
4f20: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65     }.    p = whe
4f30: 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e  reScanNext(&scan
4f40: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4f50: 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46  pResult;.}../* F
4f60: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
4f70: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
4f80: 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c  exprAnalyze(SrcL
4f90: 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73  ist*, WhereClaus
4fa0: 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  e*, int);../*.**
4fb0: 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a   Call exprAnalyz
4fc0: 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69  e on all terms i
4fd0: 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  n a WHERE clause
4fe0: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .  .*/.static vo
4ff0: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  id exprAnalyzeAl
5000: 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  l(.  SrcList *pT
5010: 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  abList,       /*
5020: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
5030: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
5040: 65 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f  e *pWC         /
5050: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
5060: 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  se to be analyze
5070: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  d */.){.  int i;
5080: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
5090: 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  erm-1; i>=0; i--
50a0: 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  ){.    exprAnaly
50b0: 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43  ze(pTabList, pWC
50c0: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  , i);.  }.}..#if
50d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
50e0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
50f0: 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ON./*.** Check t
5100: 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76  o see if the giv
5110: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
5120: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20   a LIKE or GLOB 
5130: 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a  operator that.**
5140: 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
5150: 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69  d using inequali
5160: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ty constraints. 
5170: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5180: 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20  it is.** so and 
5190: 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a  false if not..**
51a0: 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72  .** In order for
51b0: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f   the operator to
51c0: 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c   be optimizible,
51d0: 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65   the RHS must be
51e0: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74   a string.** lit
51f0: 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e  eral that does n
5200: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
5210: 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73  wildcard.  .*/.s
5220: 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65  tatic int isLike
5230: 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65 20  OrGlob(.  Parse 
5240: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
5250: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
5260: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
5270: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
5280: 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73  xpr,      /* Tes
5290: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
52a0: 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70  n */.  Expr **pp
52b0: 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69 6e  Prefix,  /* Poin
52c0: 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e 47  ter to TK_STRING
52d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
52e0: 20 70 61 74 74 65 72 6e 20 70 72 65 66 69 78 20   pattern prefix 
52f0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d  */.  int *pisCom
5300: 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20 69  plete, /* True i
5310: 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63  f the only wildc
5320: 61 72 64 20 69 73 20 25 20 69 6e 20 74 68 65 20  ard is % in the 
5330: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 2a  last character *
5340: 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65  /.  int *pnoCase
5350: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
5360: 20 75 70 70 65 72 63 61 73 65 20 69 73 20 65 71   uppercase is eq
5370: 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65  uivalent to lowe
5380: 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f  rcase */.){.  co
5390: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  nst char *z = 0;
53a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
53b0: 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b  ng on RHS of LIK
53c0: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
53d0: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70  Expr *pRight, *p
53e0: 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 52 69  Left;      /* Ri
53f0: 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 7a  ght and left siz
5400: 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74  e of LIKE operat
5410: 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  or */.  ExprList
5420: 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
5430: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70     /* List of op
5440: 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20 4c 49  erands to the LI
5450: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
5460: 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20   int c;         
5470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5480: 6e 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  ne character in 
5490: 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  z[] */.  int cnt
54a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
54b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
54c0: 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72   non-wildcard pr
54d0: 65 66 69 78 20 63 68 61 72 61 63 74 65 72 73 20  efix characters 
54e0: 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b  */.  char wc[3];
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5500: 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68 61 72  /* Wildcard char
5510: 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69  acters */.  sqli
5520: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5530: 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
5540: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
5550: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
5560: 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pVal = 0;.  in
5570: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
5580: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
5590: 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a 2f 0a  de of pRight */.
55a0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
55b0: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62  sLikeFunction(db
55c0: 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65  , pExpr, pnoCase
55d0: 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74  , wc) ){.    ret
55e0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65  urn 0;.  }.#ifde
55f0: 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a  f SQLITE_EBCDIC.
5600: 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29    if( *pnoCase )
5610: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
5620: 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  f.  pList = pExp
5630: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70 4c  r->x.pList;.  pL
5640: 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31  eft = pList->a[1
5650: 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
5660: 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Left->op!=TK_COL
5670: 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74  UMN .   || sqlit
5680: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
5690: 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46  Left)!=SQLITE_AF
56a0: 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20 49 73  F_TEXT .   || Is
56b0: 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70  Virtual(pLeft->p
56c0: 54 61 62 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  Tab).  ){.    /*
56d0: 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39   IMP: R-02065-49
56e0: 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e  465 The left-han
56f0: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49  d side of the LI
5700: 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61  KE or GLOB opera
5710: 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  tor must.    ** 
5720: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  be the name of a
5730: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
5740: 20 77 69 74 68 20 54 45 58 54 20 61 66 66 69 6e   with TEXT affin
5750: 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ity. */.    retu
5760: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 0;.  }.  asse
5770: 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  rt( pLeft->iColu
5780: 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42  mn!=(-1) ); /* B
5790: 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72  ecause IPK never
57a0: 20 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f   has AFF_TEXT */
57b0: 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c  ..  pRight = sql
57c0: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
57d0: 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ate(pList->a[0].
57e0: 70 45 78 70 72 29 3b 0a 20 20 6f 70 20 3d 20 70  pExpr);.  op = p
57f0: 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28  Right->op;.  if(
5800: 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45   op==TK_VARIABLE
5810: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52   ){.    Vdbe *pR
5820: 65 70 72 65 70 61 72 65 20 3d 20 70 50 61 72 73  eprepare = pPars
5830: 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20  e->pReprepare;. 
5840: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52     int iCol = pR
5850: 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  ight->iColumn;. 
5860: 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
5870: 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c  3VdbeGetBoundVal
5880: 75 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69  ue(pReprepare, i
5890: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Col, SQLITE_AFF_
58a0: 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70  NONE);.    if( p
58b0: 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76  Val && sqlite3_v
58c0: 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d  alue_type(pVal)=
58d0: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
58e0: 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20        z = (char 
58f0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
5900: 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20  text(pVal);.    
5910: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
5920: 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
5930: 73 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29  se->pVdbe, iCol)
5940: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
5950: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  ight->op==TK_VAR
5960: 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d  IABLE || pRight-
5970: 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
5980: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
5990: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op==TK_STRING ){
59a0: 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d  .    z = pRight-
59b0: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20  >u.zToken;.  }. 
59c0: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e   if( z ){.    cn
59d0: 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
59e0: 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20  ( (c=z[cnt])!=0 
59f0: 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63  && c!=wc[0] && c
5a00: 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63  !=wc[1] && c!=wc
5a10: 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  [2] ){.      cnt
5a20: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
5a30: 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21  ( cnt!=0 && 255!
5a40: 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b  =(u8)z[cnt-1] ){
5a50: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72  .      Expr *pPr
5a60: 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73  efix;.      *pis
5a70: 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63  Complete = c==wc
5a80: 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d  [0] && z[cnt+1]=
5a90: 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69  =0;.      pPrefi
5aa0: 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  x = sqlite3Expr(
5ab0: 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a  db, TK_STRING, z
5ac0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
5ad0: 65 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e  efix ) pPrefix->
5ae0: 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20  u.zToken[cnt] = 
5af0: 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66  0;.      *ppPref
5b00: 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20  ix = pPrefix;.  
5b10: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56      if( op==TK_V
5b20: 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ARIABLE ){.     
5b30: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
5b40: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
5b50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
5b60: 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69  etVarmask(v, pRi
5b70: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  ght->iColumn);. 
5b80: 20 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43         if( *pisC
5b90: 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68  omplete && pRigh
5ba0: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29  t->u.zToken[1] )
5bb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
5bc0: 66 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65  f the rhs of the
5bd0: 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e   LIKE expression
5be0: 20 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20   is a variable, 
5bf0: 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
5c00: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c            ** val
5c10: 75 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62  ue of the variab
5c20: 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69  le means there i
5c30: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76  s no need to inv
5c40: 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20  oke the LIKE.   
5c50: 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
5c60: 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56  on, then no OP_V
5c70: 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  ariable will be 
5c80: 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f  added to the pro
5c90: 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20  gram..          
5ca0: 2a 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70  ** This causes p
5cb0: 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20  roblems for the 
5cc0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
5cd0: 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20  ameter_name().  
5ce0: 20 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20          ** API. 
5cf0: 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68  To workaround 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 74 61 74 69 73 66 69 65 73 20 63 61 73 65 20  statisfies case 
6c10: 31 20 28 73 75 63 68 20 61 73 20 42 29 20 77 65  1 (such as B) we
6c20: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
6c30: 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a  ptimizer will.**
6c40: 20 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 63   always prefer c
6c50: 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61  ase 1, so in tha
6c60: 74 20 63 61 73 65 20 77 65 20 70 72 65 74 65 6e  t case we preten
6c70: 64 20 74 68 61 74 20 63 61 73 65 20 32 20 69 73  d that case 2 is
6c80: 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65   not.** satisfie
6c90: 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68  d..**.** It migh
6ca0: 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  t be the case th
6cb0: 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c  at multiple tabl
6cc0: 65 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  es are indexable
6cd0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a  .  For example,.
6ce0: 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69 73 20  ** (E) above is 
6cf0: 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62  indexable on tab
6d00: 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e  les P, Q, and R.
6d10: 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61  .**.** Terms tha
6d20: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  t satisfy case 2
6d30: 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20   are candidates 
6d40: 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73  for lookup by us
6d50: 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  ing.** separate 
6d60: 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20  indices to find 
6d70: 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63 68 20  rowids for each 
6d80: 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70  subterm and comp
6d90: 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69  osing.** the uni
6da0: 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73  on of all rowids
6db0: 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20   using a RowSet 
6dc0: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73  object.  This is
6dd0: 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22   similar.** to "
6de0: 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20  bitmap indices" 
6df0: 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  in other databas
6e00: 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a  e engines..**.**
6e10: 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a   OTHERWISE:.**.*
6e20: 2a 20 49 66 20 6e 65 69 74 68 65 72 20 63 61 73  * If neither cas
6e30: 65 20 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61  e 1 nor case 2 a
6e40: 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65  pply, then leave
6e50: 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73   the eOperator s
6e60: 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20  et to.** zero.  
6e70: 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74  This term is not
6e80: 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72   useful for sear
6e90: 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ch..*/.static vo
6ea0: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72  id exprAnalyzeOr
6eb0: 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20  Term(.  SrcList 
6ec0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
6ed0: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
6ee0: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
6ef0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
6f00: 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c      /* the compl
6f10: 65 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ete WHERE clause
6f20: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72   */.  int idxTer
6f30: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
6f40: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
6f50: 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  OR-term to be an
6f60: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
6f70: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
6f80: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20   = pWC->pWInfo; 
6f90: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
6fa0: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
6fb0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  g context */.  P
6fc0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
6fd0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
6fe0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
6ff0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
7000: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7010: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
7020: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
7030: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
7040: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
7050: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
7060: 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65  Term];    /* The
7070: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
7080: 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  yzed */.  Expr *
7090: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
70a0: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
70b0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
70c0: 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20  ion of the term 
70d0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 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 20 2f 2a 20               /* 
7100: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
7110: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
7120: 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20  pOrWc;       /* 
7130: 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d  Breakup of pTerm
7140: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
7150: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
7160: 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a  OrTerm;       /*
7170: 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68   A Sub-term with
7180: 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a  in the pOrWc */.
7190: 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70    WhereOrInfo *p
71a0: 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41  OrInfo;     /* A
71b0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
71c0: 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64  ation associated
71d0: 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20   with pTerm */. 
71e0: 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49   Bitmask chngToI
71f0: 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  N;         /* Ta
7200: 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20  bles that might 
7210: 73 61 74 69 73 66 79 20 63 61 73 65 20 31 20 2a  satisfy case 1 *
7220: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
7230: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  xable;        /*
7240: 20 54 61 62 6c 65 73 20 74 68 61 74 20 61 72 65   Tables that are
7250: 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69   indexable, sati
7260: 73 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f  sfying case 2 */
7270: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61  ..  /*.  ** Brea
7280: 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  k the OR clause 
7290: 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61 74  into its separat
72a0: 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65  e subterms.  The
72b0: 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20   subterms are.  
72c0: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57  ** stored in a W
72d0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
72e0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
72f0: 77 69 74 68 69 6e 20 74 68 65 20 57 68 65 72 65  within the Where
7300: 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65  OrInfo.  ** obje
7310: 63 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63  ct that is attac
7320: 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69  hed to the origi
7330: 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65  nal OR clause te
7340: 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  rm..  */.  asser
7350: 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  t( (pTerm->wtFla
7360: 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d  gs & (TERM_DYNAM
7370: 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54  IC|TERM_ORINFO|T
7380: 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30  ERM_ANDINFO))==0
7390: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
73a0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
73b0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  ;.  pTerm->u.pOr
73c0: 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d  Info = pOrInfo =
73d0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
73e0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
73f0: 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66  *pOrInfo));.  if
7400: 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72  ( pOrInfo==0 ) r
7410: 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e  eturn;.  pTerm->
7420: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
7430: 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20  ORINFO;.  pOrWc 
7440: 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  = &pOrInfo->wc;.
7450: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
7460: 74 28 70 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29  t(pOrWc, pWInfo)
7470: 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70  ;.  whereSplit(p
7480: 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f  OrWc, pExpr, TK_
7490: 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79  OR);.  exprAnaly
74a0: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57  zeAll(pSrc, pOrW
74b0: 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  c);.  if( db->ma
74c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
74d0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
74e0: 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29  OrWc->nTerm>=2 )
74f0: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d  ;..  /*.  ** Com
7500: 70 75 74 65 20 74 68 65 20 73 65 74 20 6f 66 20  pute the set of 
7510: 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68  tables that migh
7520: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 73 20  t satisfy cases 
7530: 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69  1 or 2..  */.  i
7540: 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74  ndexable = ~(Bit
7550: 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f  mask)0;.  chngTo
7560: 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  IN = ~(Bitmask)0
7570: 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d  ;.  for(i=pOrWc-
7580: 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  >nTerm-1, pOrTer
7590: 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30  m=pOrWc->a; i>=0
75a0: 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69   && indexable; i
75b0: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
75c0: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
75d0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
75e0: 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20  _SINGLE)==0 ){. 
75f0: 20 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66       WhereAndInf
7600: 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20  o *pAndInfo;.   
7610: 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 72 54     assert( (pOrT
7620: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
7630: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52  TERM_ANDINFO|TER
7640: 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b  M_ORINFO))==0 );
7650: 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20  .      chngToIN 
7660: 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49  = 0;.      pAndI
7670: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
7680: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
7690: 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b  eof(*pAndInfo));
76a0: 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 49  .      if( pAndI
76b0: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57  nfo ){.        W
76c0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64  hereClause *pAnd
76d0: 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72  WC;.        Wher
76e0: 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b  eTerm *pAndTerm;
76f0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
7700: 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
7710: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  b = 0;.        p
7720: 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
7730: 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20  fo = pAndInfo;. 
7740: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
7750: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
7760: 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20  ANDINFO;.       
7770: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
7780: 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20  tor = WO_AND;.  
7790: 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26        pAndWC = &
77a0: 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  pAndInfo->wc;.  
77b0: 20 20 20 20 20 20 77 68 65 72 65 43 6c 61 75 73        whereClaus
77c0: 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57  eInit(pAndWC, pW
77d0: 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  C->pWInfo);.    
77e0: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
77f0: 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e  AndWC, pOrTerm->
7800: 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a  pExpr, TK_AND);.
7810: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
7820: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e  yzeAll(pSrc, pAn
7830: 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41  dWC);.        pA
7840: 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70  ndWC->pOuter = p
7850: 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  WC;.        test
7860: 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
7870: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
7880: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
7890: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
78a0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41       for(j=0, pA
78b0: 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61  ndTerm=pAndWC->a
78c0: 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72  ; j<pAndWC->nTer
78d0: 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d  m; j++, pAndTerm
78e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
78f0: 20 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72   assert( pAndTer
7900: 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
7910: 20 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f          if( allo
7920: 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e  wedOp(pAndTerm->
7930: 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20  pExpr->op) ){.  
7940: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d              b |=
7950: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
7960: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64  ->sMaskSet, pAnd
7970: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
7980: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
7990: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
79a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
79b0: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
79c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
79d0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
79e0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
79f0: 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  IED ){.      /* 
7a00: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66  Skip this term f
7a10: 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69  or now.  We revi
7a20: 73 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70  sit it when we p
7a30: 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20  rocess the.     
7a40: 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e   ** correspondin
7a50: 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74  g TERM_VIRTUAL t
7a60: 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  erm */.    }else
7a70: 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
7a80: 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74  b;.      b = get
7a90: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
7aa0: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
7ab0: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
7ac0: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
7ad0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
7ae0: 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20  VIRTUAL ){.     
7af0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
7b00: 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61  ther = &pOrWc->a
7b10: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
7b20: 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d  t];.        b |=
7b30: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
7b40: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68  ->sMaskSet, pOth
7b50: 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  er->leftCursor);
7b60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7b70: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
7b80: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
7b90: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7ba0: 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20  O_EQ)==0 ){.    
7bb0: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30      chngToIN = 0
7bc0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7bd0: 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20         chngToIN 
7be0: 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &= b;.      }.  
7bf0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
7c00: 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65  ** Record the se
7c10: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
7c20: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e   satisfy case 2.
7c30: 20 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20    The set might 
7c40: 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20  be.  ** empty.. 
7c50: 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69   */.  pOrInfo->i
7c60: 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78  ndexable = index
7c70: 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65  able;.  pTerm->e
7c80: 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78  Operator = index
7c90: 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f  able==0 ? 0 : WO
7ca0: 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  _OR;..  /*.  ** 
7cb0: 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61  chngToIN holds a
7cc0: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
7cd0: 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69  hat *might* sati
7ce0: 73 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74  sfy case 1.  But
7cf0: 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f  .  ** we have to
7d00: 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f   do some additio
7d10: 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  nal checking to 
7d20: 73 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65  see if case 1 re
7d30: 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74  ally.  ** is sat
7d40: 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  isfied..  **.  *
7d50: 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20  * chngToIN will 
7d60: 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31  hold either 0, 1
7d70: 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68  , or 2 bits.  Th
7d80: 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61  e 0-bit case mea
7d90: 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ns.  ** that the
7da0: 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69  re is no possibi
7db0: 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72  lity of transfor
7dc0: 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75  ming the OR clau
7dd0: 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20  se into an.  ** 
7de0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61  IN operator beca
7df0: 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  use one or more 
7e00: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20  terms in the OR 
7e10: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20  clause contain. 
7e20: 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74   ** something ot
7e30: 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61  her than == on a
7e40: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73   column in the s
7e50: 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68  ingle table.  Th
7e60: 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73  e 1-bit.  ** cas
7e70: 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65  e means that eve
7e80: 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  ry term of the O
7e90: 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74  R clause is of t
7ea0: 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61  he form.  ** "ta
7eb0: 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22  ble.column=expr"
7ec0: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
7ed0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65   table.  The one
7ee0: 20 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74   bit that is set
7ef0: 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65  .  ** will corre
7f00: 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d  spond to the com
7f10: 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73  mon table.  We s
7f20: 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65  till need to che
7f30: 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20  ck to make.  ** 
7f40: 73 75 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f  sure the same co
7f50: 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20  lumn is used on 
7f60: 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20  all terms.  The 
7f70: 32 2d 62 69 74 20 63 61 73 65 20 69 73 20 77 68  2-bit case is wh
7f80: 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20  en.  ** the all 
7f90: 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65  terms are of the
7fa0: 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f   form "table1.co
7fb0: 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75  lumn=table2.colu
7fc0: 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69  mn".  It.  ** mi
7fd0: 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  ght be possible 
7fe0: 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70  to form an IN op
7ff0: 65 72 61 74 6f 72 20 77 69 74 68 20 65 69 74 68  erator with eith
8000: 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e  er table1.column
8010: 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e  .  ** or table2.
8020: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48  column as the LH
8030: 53 20 69 66 20 65 69 74 68 65 72 20 69 73 20 63  S if either is c
8040: 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74  ommon to every t
8050: 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  erm of.  ** the 
8060: 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OR clause..  **.
8070: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
8080: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
8090: 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d   "table.column1=
80a0: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28  table.column2" (
80b0: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61  the.  ** same ta
80c0: 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65  ble on both size
80d0: 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e  s of the ==) can
80e0: 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  not be optimized
80f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e  ..  */.  if( chn
8100: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74  gToIN ){.    int
8110: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
8120: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
8130: 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e  f the conversion
8140: 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20   to IN is valid 
8150: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75  */.    int iColu
8160: 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  mn = -1;        
8170: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78   /* Column index
8180: 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70   on lhs of IN op
8190: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e  erator */.    in
81a0: 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20  t iCursor = -1; 
81b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
81c0: 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74   cursor common t
81d0: 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20  o all terms */. 
81e0: 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20     int j = 0;   
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8200: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
8210: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  .    /* Search f
8220: 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63  or a table and c
8230: 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61  olumn that appea
8240: 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f  rs on one side o
8250: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68  r the.    ** oth
8260: 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65  er of the == ope
8270: 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73  rator in every s
8280: 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61  ubterm.  That ta
8290: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20  ble and column. 
82a0: 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
82b0: 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f  corded in iCurso
82c0: 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20  r and iColumn.  
82d0: 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20  There might not 
82e0: 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75  be any.    ** su
82f0: 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ch table and col
8300: 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68  umn.  Set okToCh
8310: 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70  ngToIN if an app
8320: 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20  ropriate table. 
8330: 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e     ** and column
8340: 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65   is found but le
8350: 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  ave okToChngToIN
8360: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f   false if not fo
8370: 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  und..    */.    
8380: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20  for(j=0; j<2 && 
8390: 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a  !okToChngToIN; j
83a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65  ++){.      pOrTe
83b0: 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20  rm = pOrWc->a;. 
83c0: 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63       for(i=pOrWc
83d0: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
83e0: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
83f0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
8400: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
8410: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
8420: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
8430: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
8440: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
8450: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
8460: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
8470: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
8480: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d  * This is the 2-
8490: 62 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20  bit case and we 
84a0: 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  are on the secon
84b0: 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a  d iteration and.
84c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
84d0: 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f  rent term is fro
84e0: 6d 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  m the first iter
84f0: 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20  ation.  So skip 
8500: 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  this term. */.  
8510: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8520: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
8530: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8540: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
8550: 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65  ( (chngToIN & ge
8560: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
8570: 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d  MaskSet, pOrTerm
8580: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d  ->leftCursor))==
8590: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
85a0: 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74  * This term must
85b0: 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
85c0: 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65  t1.a==t2.b where
85d0: 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20   t2 is in the.  
85e0: 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54          ** chngT
85f0: 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31 20 69  oIN set but t1 i
8600: 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72  s not.  This ter
8610: 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72  m will be either
8620: 20 70 72 65 63 65 65 64 65 64 0a 20 20 20 20 20   preceeded.     
8630: 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77       ** or follw
8640: 65 64 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65  ed by an inverte
8650: 64 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31  d copy (t2.b==t1
8660: 2e 61 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20  .a).  Skip this 
8670: 74 65 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20  term .          
8680: 2a 2a 20 61 6e 64 20 75 73 65 20 69 74 73 20 69  ** and use its i
8690: 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20  nversion. */.   
86a0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
86b0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
86c0: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  s & TERM_COPIED 
86d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
86e0: 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e  tcase( pOrTerm->
86f0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
8700: 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
8710: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
8720: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
8730: 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d  TERM_COPIED|TERM
8740: 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20  _VIRTUAL) );.   
8750: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8760: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8770: 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72     iColumn = pOr
8780: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
8790: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72  mn;.        iCur
87a0: 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c  sor = pOrTerm->l
87b0: 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  eftCursor;.     
87c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
87d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30 20  }.      if( i<0 
87e0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ){.        /* No
87f0: 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65   candidate table
8800: 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e  +column was foun
8810: 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  d.  This can onl
8820: 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20  y occur.        
8830: 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  ** on the second
8840: 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
8850: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d        assert( j=
8860: 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =1 );.        as
8870: 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
8880: 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a  wo(chngToIN) );.
8890: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
88a0: 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73  chngToIN==getMas
88b0: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
88c0: 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b  Set, iCursor) );
88d0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
88e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
88f0: 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a  stcase( j==1 );.
8900: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76  .      /* We hav
8910: 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64  e found a candid
8920: 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  ate table and co
8930: 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20  lumn.  Check to 
8940: 73 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20  see if that.    
8950: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63    ** table and c
8960: 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20  olumn is common 
8970: 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
8980: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a   the OR clause *
8990: 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67  /.      okToChng
89a0: 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20  ToIN = 1;.      
89b0: 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b  for(; i>=0 && ok
89c0: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c  ToChngToIN; i--,
89d0: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
89e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
89f0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8a00: 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
8a10: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
8a20: 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
8a30: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
8a40: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
8a50: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
8a60: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
8a70: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  if( pOrTerm->u.l
8a80: 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  eftColumn!=iColu
8a90: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
8aa0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
8ab0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
8ac0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61  .          int a
8ad0: 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74  ffLeft, affRight
8ae0: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;.          /* I
8af0: 66 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  f the right-hand
8b00: 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20   side is also a 
8b10: 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65  column, then the
8b20: 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20   affinities.    
8b30: 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68        ** of both
8b40: 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   right and left 
8b50: 73 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75  sides must be su
8b60: 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a  ch that no type.
8b70: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
8b80: 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71  versions are req
8b90: 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67  uired on the rig
8ba0: 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32  ht.  (Ticket #22
8bb0: 34 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  49).          */
8bc0: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 52 69  .          affRi
8bd0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
8be0: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
8bf0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
8c00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  );.          aff
8c10: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
8c20: 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65  prAffinity(pOrTe
8c30: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  rm->pExpr->pLeft
8c40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
8c50: 20 61 66 66 52 69 67 68 74 21 3d 30 20 26 26 20   affRight!=0 && 
8c60: 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66  affRight!=affLef
8c70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
8c80: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
8c90: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
8ca0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
8cb0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
8cc0: 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a   |= TERM_OR_OK;.
8cd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8ce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8cf0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
8d00: 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43  his point, okToC
8d10: 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20  hngToIN is true 
8d20: 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72  if original pTer
8d30: 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20 20 20  m satisfies.    
8d40: 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74  ** case 1.  In t
8d50: 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72  hat case, constr
8d60: 75 63 74 20 61 20 6e 65 77 20 76 69 72 74 75 61  uct a new virtua
8d70: 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a  l term that is .
8d80: 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e      ** pTerm con
8d90: 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49  verted into an I
8da0: 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  N operator..    
8db0: 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43  */.    if( okToC
8dc0: 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20  hngToIN ){.     
8dd0: 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20   Expr *pDup;    
8de0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61          /* A tra
8df0: 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65  nsient duplicate
8e00: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
8e10: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
8e20: 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54  List = 0;   /* T
8e30: 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
8e40: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
8e50: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
8e60: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65   0;       /* The
8e70: 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
8e80: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
8e90: 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20   Expr *pNew;    
8ea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
8eb0: 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61  omplete IN opera
8ec0: 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  tor */..      fo
8ed0: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
8ee0: 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57  -1, pOrTerm=pOrW
8ef0: 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  c->a; i>=0; i--,
8f00: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
8f10: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
8f20: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
8f30: 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f  M_OR_OK)==0 ) co
8f40: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
8f50: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
8f60: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8f70: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EQ );.        as
8f80: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  sert( pOrTerm->l
8f90: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73  eftCursor==iCurs
8fa0: 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  or );.        as
8fb0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75  sert( pOrTerm->u
8fc0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
8fd0: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
8fe0: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
8ff0: 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72  prDup(db, pOrTer
9000: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
9010: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  , 0);.        pL
9020: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
9030: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57 49 6e  rListAppend(pWIn
9040: 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73  fo->pParse, pLis
9050: 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  t, pDup);.      
9060: 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72    pLeft = pOrTer
9070: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  m->pExpr->pLeft;
9080: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
9090: 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20  ssert( pLeft!=0 
90a0: 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20  );.      pDup = 
90b0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
90c0: 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  b, pLeft, 0);.  
90d0: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
90e0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
90f0: 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20  TK_IN, pDup, 0, 
9100: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
9110: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ew ){.        in
9120: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
9130: 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61    transferJoinMa
9140: 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78  rkings(pNew, pEx
9150: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  pr);.        ass
9160: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
9170: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
9180: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
9190: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
91a0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  st = pList;.    
91b0: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
91c0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
91d0: 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56  WC, pNew, TERM_V
91e0: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
91f0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65  MIC);.        te
9200: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
9210: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  0 );.        exp
9220: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
9230: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20  WC, idxNew);.   
9240: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
9250: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
9260: 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64         pWC->a[id
9270: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
9280: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  idxTerm;.       
9290: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
92a0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
92b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
92c0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
92d0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  b, pList);.     
92e0: 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e   }.      pTerm->
92f0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e  eOperator = WO_N
9300: 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20  OOP;  /* case 1 
9310: 74 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f  trumps case 2 */
9320: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
9330: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
9340: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
9350: 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  ION && !SQLITE_O
9360: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
9370: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
9380: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
9390: 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d   is an WhereTerm
93a0: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
93b0: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78  only the.** "pEx
93c0: 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64  pr" field filled
93d0: 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66   in.  The job of
93e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
93f0: 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a   to analyze the.
9400: 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
9410: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c   and populate al
9420: 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c  l the other fiel
9430: 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54  ds of the WhereT
9440: 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  erm.** structure
9450: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
9460: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
9470: 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e  the form "<expr>
9480: 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73   <op> X" it gets
9490: 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20   commuted.** to 
94a0: 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72  the standard for
94b0: 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78  m of "X <op> <ex
94c0: 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pr>"..**.** If t
94d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
94e0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
94f0: 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f  <op> Y" where bo
9500: 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a  th X and Y are.*
9510: 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  * columns, then 
9520: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70  the original exp
9530: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61  ression is uncha
9540: 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76  nged and a new v
9550: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f  irtual.** term o
9560: 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f  f the form "Y <o
9570: 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74  p> X" is added t
9580: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
9590: 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a  se and.** analyz
95a0: 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
95b0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
95c0: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
95d0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20   TERM_COPIED.** 
95e0: 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d  and the new term
95f0: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
9600: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65  TERM_DYNAMIC (be
9610: 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72  cause it's pExpr
9620: 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
9630: 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57  freed with the W
9640: 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20  hereClause) and 
9650: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65  TERM_VIRTUAL (be
9660: 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61  cause it.** is a
9670: 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f   commuted copy o
9680: 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29  f a prior term.)
9690: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
96a0: 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31  erm has nChild=1
96b0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79  .** and the copy
96c0: 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73   has idxParent s
96d0: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
96e0: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
96f0: 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  term..*/.static 
9700: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
9710: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
9720: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
9730: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9740: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
9750: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
9760: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
9770: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
9780: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
9790: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
97a0: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
97b0: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
97c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
97d0: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20   = pWC->pWInfo; 
97e0: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
97f0: 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65  processing conte
9800: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
9810: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
9820: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9830: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
9840: 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  zed */.  WhereMa
9850: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
9860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
9870: 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20   of table index 
9880: 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20  masks */.  Expr 
9890: 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  *pExpr;         
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
98b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
98c0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
98d0: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
98e0: 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20  Left;           
98f0: 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69     /* Prerequesi
9900: 74 65 73 20 6f 66 20 74 68 65 20 70 45 78 70 72  tes of the pExpr
9910: 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74  ->pLeft */.  Bit
9920: 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20  mask prereqAll; 
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9940: 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f   Prerequesites o
9950: 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74  f pExpr */.  Bit
9960: 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74 20  mask extraRight 
9970: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
9980: 20 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e 63   Extra dependenc
9990: 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e  ies on LEFT JOIN
99a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 72   */.  Expr *pStr
99b0: 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
99c0: 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66         /* RHS of
99d0: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
99e0: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  tor */.  int isC
99f0: 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  omplete = 0;    
9a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
9a10: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e   of LIKE/GLOB en
9a20: 64 73 20 77 69 74 68 20 77 69 6c 64 63 61 72 64  ds with wildcard
9a30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65   */.  int noCase
9a40: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9a50: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47         /* LIKE/G
9a60: 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68 65  LOB distinguishe
9a70: 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  s case */.  int 
9a80: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9aa0: 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74  Top-level operat
9ab0: 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a  or.  pExpr->op *
9ac0: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
9ad0: 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
9ae0: 73 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  se;  /* Parsing 
9af0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
9b00: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9b10: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a  e->db;        /*
9b20: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
9b30: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64  tion */..  if( d
9b40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9b50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
9b60: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57   }.  pTerm = &pW
9b70: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
9b80: 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
9b90: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
9ba0: 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e   pExpr = pTerm->
9bb0: 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
9bc0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
9bd0: 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d  S && pExpr->op!=
9be0: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20  TK_COLLATE );.  
9bf0: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70  prereqLeft = exp
9c00: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
9c10: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  kSet, pExpr->pLe
9c20: 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70  ft);.  op = pExp
9c30: 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  r->op;.  if( op=
9c40: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73  =TK_IN ){.    as
9c50: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
9c60: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
9c70: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
9c80: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
9c90: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
9ca0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
9cb0: 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54  ht = exprSelectT
9cc0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
9cd0: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  et, pExpr->x.pSe
9ce0: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
9cf0: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
9d00: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
9d10: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
9d20: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
9d30: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
9d40: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
9d50: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
9d60: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
9d70: 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ight = 0;.  }els
9d80: 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  e{.    pTerm->pr
9d90: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
9da0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
9db0: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Set, pExpr->pRig
9dc0: 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65  ht);.  }.  prere
9dd0: 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65  qAll = exprTable
9de0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
9df0: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78  pExpr);.  if( Ex
9e00: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
9e10: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
9e20: 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ) ){.    Bitmask
9e30: 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   x = getMask(pMa
9e40: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52  skSet, pExpr->iR
9e50: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a  ightJoinTable);.
9e60: 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d      prereqAll |=
9e70: 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67   x;.    extraRig
9e80: 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e  ht = x-1;  /* ON
9e90: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
9ea0: 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  y not be used wi
9eb0: 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20  th an index.    
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61     ** on left ta
9ee0: 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
9ef0: 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  IN.  Ticket #301
9f00: 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d  5 */.  }.  pTerm
9f10: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
9f20: 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d  ereqAll;.  pTerm
9f30: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d  ->leftCursor = -
9f40: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  1;.  pTerm->iPar
9f50: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  ent = -1;.  pTer
9f60: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30  m->eOperator = 0
9f70: 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f  ;.  if( allowedO
9f80: 70 28 6f 70 29 20 29 7b 0a 20 20 20 20 45 78 70  p(op) ){.    Exp
9f90: 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r *pLeft = sqlit
9fa0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
9fb0: 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  e(pExpr->pLeft);
9fc0: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
9fd0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  t = sqlite3ExprS
9fe0: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
9ff0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 75  ->pRight);.    u
a000: 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65  16 opMask = (pTe
a010: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
a020: 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30  & prereqLeft)==0
a030: 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45   ? WO_ALL : WO_E
a040: 51 55 49 56 3b 0a 20 20 20 20 69 66 28 20 70 4c  QUIV;.    if( pL
a050: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
a060: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  MN ){.      pTer
a070: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
a080: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
a090: 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65       pTerm->u.le
a0a0: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
a0b0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
a0c0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
a0d0: 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  r = operatorMask
a0e0: 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20  (op) & opMask;. 
a0f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69     }.    if( pRi
a100: 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f  ght && pRight->o
a110: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
a120: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
a130: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
a140: 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 75  r *pDup;.      u
a150: 31 36 20 65 45 78 74 72 61 4f 70 20 3d 20 30 3b  16 eExtraOp = 0;
a160: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
a170: 20 62 69 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e   bits for pNew->
a180: 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20  eOperator */.   
a190: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
a1a0: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
a1b0: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
a1c0: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
a1d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a1e0: 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
a1f0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
a200: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
a210: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a220: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
a230: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
a240: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
a250: 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65   }.        idxNe
a260: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
a270: 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c  nsert(pWC, pDup,
a280: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
a290: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
a2a0: 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d       if( idxNew=
a2b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
a2c0: 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43       pNew = &pWC
a2d0: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
a2e0: 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65       pNew->iPare
a2f0: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
a300: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
a310: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
a320: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e          pTerm->n
a330: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
a340: 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
a350: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
a360: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
a370: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20  xpr->op==TK_EQ. 
a380: 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72          && !Expr
a390: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
a3a0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
a3b0: 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
a3c0: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
a3d0: 64 62 2c 20 53 51 4c 49 54 45 5f 54 72 61 6e 73  db, SQLITE_Trans
a3e0: 69 74 69 76 65 29 0a 20 20 20 20 20 20 20 20 29  itive).        )
a3f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72  {.          pTer
a400: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20  m->eOperator |= 
a410: 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20  WO_EQUIV;.      
a420: 20 20 20 20 65 45 78 74 72 61 4f 70 20 3d 20 57      eExtraOp = W
a430: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20  O_EQUIV;.       
a440: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
a450: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70          pDup = p
a460: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e  Expr;.        pN
a470: 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  ew = pTerm;.    
a480: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f    }.      exprCo
a490: 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44  mmute(pParse, pD
a4a0: 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74  up);.      pLeft
a4b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
a4c0: 69 70 43 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e  ipCollate(pDup->
a4d0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e  pLeft);.      pN
a4e0: 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  ew->leftCursor =
a4f0: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
a500: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65        pNew->u.le
a510: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
a520: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
a530: 20 74 65 73 74 63 61 73 65 28 20 28 70 72 65 72   testcase( (prer
a540: 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69  eqLeft | extraRi
a550: 67 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65  ght) != prereqLe
a560: 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ft );.      pNew
a570: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
a580: 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74  prereqLeft | ext
a590: 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70  raRight;.      p
a5a0: 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  New->prereqAll =
a5b0: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20   prereqAll;.    
a5c0: 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f    pNew->eOperato
a5d0: 72 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d 61 73  r = (operatorMas
a5e0: 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45  k(pDup->op) + eE
a5f0: 78 74 72 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b  xtraOp) & opMask
a600: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
a610: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a620: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
a630: 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20  ATION.  /* If a 
a640: 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57  term is the BETW
a650: 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72  EEN operator, cr
a660: 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72  eate two new vir
a670: 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20  tual terms.  ** 
a680: 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20  that define the 
a690: 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42  range that the B
a6a0: 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74  ETWEEN implement
a6b0: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
a6c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
a6d0: 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20  a BETWEEN b AND 
a6e0: 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63  c.  **.  ** is c
a6f0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20  onverted into:. 
a700: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61   **.  **      (a
a710: 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63   BETWEEN b AND c
a720: 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44  ) AND (a>=b) AND
a730: 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a   (a<=c).  **.  *
a740: 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65  * The two new te
a750: 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e  rms are added on
a760: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
a770: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
a780: 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e  ject..  ** The n
a790: 65 77 20 74 65 72 6d 73 20 61 72 65 20 22 64 79  ew terms are "dy
a7a0: 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63  namic" and are c
a7b0: 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f  hildren of the o
a7c0: 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a  riginal BETWEEN.
a7d0: 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74    ** term.  That
a7e0: 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
a7f0: 68 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  he BETWEEN term 
a800: 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68  is coded, the ch
a810: 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20  ildren are.  ** 
a820: 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66  skipped.  Or, if
a830: 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72   the children ar
a840: 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20 61  e satisfied by a
a850: 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69  n index, the ori
a860: 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45  ginal.  ** BETWE
a870: 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70  EN term is skipp
a880: 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
a890: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
a8a0: 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57 43  K_BETWEEN && pWC
a8b0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
a8c0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
a8d0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
a8e0: 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  List;.    int i;
a8f0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
a900: 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b  t u8 ops[] = {TK
a910: 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20  _GE, TK_LE};.   
a920: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
a930: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
a940: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32   pList->nExpr==2
a950: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
a960: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
a970: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
a980: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e  ;.      int idxN
a990: 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78  ew;.      pNewEx
a9a0: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
a9b0: 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d  r(pParse, ops[i]
a9c0: 2c 20 0a 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 20 20                  
a9e0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a9f0: 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
aa00: 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
aa30: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
aa40: 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a  .pExpr, 0), 0);.
aa50: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f        transferJo
aa60: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
aa70: 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  xpr, pExpr);.   
aa80: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
aa90: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
aaa0: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
aab0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
aac0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
aad0: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
aae0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
aaf0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
ab00: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
ab10: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
ab20: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
ab30: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
ab40: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
ab50: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  rm;.    }.    pT
ab60: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
ab70: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
ab80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
ab90: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  EN_OPTIMIZATION 
aba0: 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
abb0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
abc0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
abd0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
abe0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
abf0: 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74    /* Analyze a t
ac00: 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70  erm that is comp
ac10: 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d  osed of two or m
ac20: 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e  ore subterms con
ac30: 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61  nected by.  ** a
ac40: 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n OR operator.. 
ac50: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
ac60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
ac70: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
ac80: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
ac90: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
aca0: 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57  eOrTerm(pSrc, pW
acb0: 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  C, idxTerm);.   
acc0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
acd0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23  [idxTerm];.  }.#
ace0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
acf0: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
ad00: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
ad10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
ad20: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  E_OPTIMIZATION. 
ad30: 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69   /* Add constrai
ad40: 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68  nts to reduce th
ad50: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f  e search space o
ad60: 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  n a LIKE or GLOB
ad70: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  .  ** operator..
ad80: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65    **.  ** A like
ad90: 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20   pattern of the 
ada0: 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62  form "x LIKE 'ab
adb0: 63 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20  c%'" is changed 
adc0: 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73  into constraints
add0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
ade0: 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44      x>='abc' AND
adf0: 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c   x<'abd' AND x L
ae00: 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a  IKE 'abc%'.  **.
ae10: 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68    ** The last ch
ae20: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70  aracter of the p
ae30: 72 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69  refix "abc" is i
ae40: 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f  ncremented to fo
ae50: 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d  rm the.  ** term
ae60: 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f  ination conditio
ae70: 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20  n "abd"..  */.  
ae80: 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  if( pWC->op==TK_
ae90: 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b  AND .   && isLik
aea0: 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20  eOrGlob(pParse, 
aeb0: 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26  pExpr, &pStr1, &
aec0: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43  isComplete, &noC
aed0: 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78  ase).  ){.    Ex
aee0: 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  pr *pLeft;      
aef0: 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f   /* LHS of LIKE/
af00: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
af10: 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 32  .    Expr *pStr2
af20: 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ;       /* Copy 
af30: 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f  of pStr1 - RHS o
af40: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
af50: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  ator */.    Expr
af60: 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20   *pNewExpr1;.   
af70: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32   Expr *pNewExpr2
af80: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
af90: 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  1;.    int idxNe
afa0: 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43  w2;.    Token sC
afb0: 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20  ollSeqName;  /* 
afc0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
afd0: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20  g sequence */.. 
afe0: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
aff0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
b000: 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32  pExpr;.    pStr2
b010: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b020: 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b  p(db, pStr1, 0);
b030: 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  .    if( !db->ma
b040: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
b050: 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20      u8 c, *pC;  
b060: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61       /* Last cha
b070: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
b080: 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64  e first wildcard
b090: 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28   */.      pC = (
b0a0: 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54  u8*)&pStr2->u.zT
b0b0: 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c  oken[sqlite3Strl
b0c0: 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54  en30(pStr2->u.zT
b0d0: 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20  oken)-1];.      
b0e0: 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69  c = *pC;.      i
b0f0: 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
b100: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
b110: 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e  t is to incremen
b120: 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  t the last chara
b130: 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20  cter before the 
b140: 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  first.        **
b150: 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20   wildcard.  But 
b160: 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20  if we increment 
b170: 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70  '@', that will p
b180: 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  ush it into the.
b190: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61          ** alpha
b1a0: 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72  betic range wher
b1b0: 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f  e case conversio
b1c0: 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20  ns will mess up 
b1d0: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
b1e0: 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20  inequality.  To 
b1f0: 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65  avoid this, make
b200: 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75   sure to also ru
b210: 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20  n the full.     
b220: 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c     ** LIKE on al
b230: 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72  l candidate expr
b240: 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72  essions by clear
b250: 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65  ing the isComple
b260: 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20  te flag.        
b270: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  */.        if( c
b280: 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70  =='A'-1 ) isComp
b290: 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  lete = 0;.      
b2a0: 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70    c = sqlite3Upp
b2b0: 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20  erToLower[c];.  
b2c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20      }.      *pC 
b2d0: 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  = c + 1;.    }. 
b2e0: 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e     sCollSeqName.
b2f0: 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f  z = noCase ? "NO
b300: 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22  CASE" : "BINARY"
b310: 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61  ;.    sCollSeqNa
b320: 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70 4e  me.n = 6;.    pN
b330: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
b340: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
b350: 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77  ft, 0);.    pNew
b360: 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50  Expr1 = sqlite3P
b370: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
b380: 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  GE, .           
b390: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
b3a0: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
b3b0: 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73 43 6f  e,pNewExpr1,&sCo
b3c0: 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
b3d0: 20 20 20 20 20 20 20 70 53 74 72 31 2c 20 30 29         pStr1, 0)
b3e0: 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f  ;.    transferJo
b3f0: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
b400: 78 70 72 31 2c 20 70 45 78 70 72 29 3b 0a 20 20  xpr1, pExpr);.  
b410: 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72    idxNew1 = wher
b420: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
b430: 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45  C, pNewExpr1, TE
b440: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
b450: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65  DYNAMIC);.    te
b460: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d  stcase( idxNew1=
b470: 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  =0 );.    exprAn
b480: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
b490: 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70   idxNew1);.    p
b4a0: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
b4b0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
b4c0: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65  eft, 0);.    pNe
b4d0: 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33  wExpr2 = sqlite3
b4e0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
b4f0: 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _LT,.           
b500: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
b510: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
b520: 65 2c 70 4e 65 77 45 78 70 72 32 2c 26 73 43 6f  e,pNewExpr2,&sCo
b530: 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
b540: 20 20 20 20 20 20 20 70 53 74 72 32 2c 20 30 29         pStr2, 0)
b550: 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f  ;.    transferJo
b560: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
b570: 78 70 72 32 2c 20 70 45 78 70 72 29 3b 0a 20 20  xpr2, pExpr);.  
b580: 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72    idxNew2 = wher
b590: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
b5a0: 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45  C, pNewExpr2, TE
b5b0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
b5c0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65  DYNAMIC);.    te
b5d0: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d  stcase( idxNew2=
b5e0: 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  =0 );.    exprAn
b5f0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
b600: 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70   idxNew2);.    p
b610: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
b620: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28  dxTerm];.    if(
b630: 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20   isComplete ){. 
b640: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
b650: 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  ew1].iParent = i
b660: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57  dxTerm;.      pW
b670: 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50  C->a[idxNew2].iP
b680: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
b690: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
b6a0: 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a  hild = 2;.    }.
b6b0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
b6c0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
b6d0: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
b6e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b6f0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
b700: 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d  .  /* Add a WO_M
b710: 41 54 43 48 20 61 75 78 69 6c 69 61 72 79 20 74  ATCH auxiliary t
b720: 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74  erm to the const
b730: 72 61 69 6e 74 20 73 65 74 20 69 66 20 74 68 65  raint set if the
b740: 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78  .  ** current ex
b750: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
b760: 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e  he form:  column
b770: 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a   MATCH expr..  *
b780: 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  * This informati
b790: 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68  on is used by th
b7a0: 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
b7b0: 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72  hods of.  ** vir
b7c0: 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68  tual tables.  Th
b7d0: 65 20 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f  e native query o
b7e0: 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f  ptimizer does no
b7f0: 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74  t attempt.  ** t
b800: 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69  o do anything wi
b810: 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f  th MATCH functio
b820: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ns..  */.  if( i
b830: 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70  sMatchOfColumn(p
b840: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  Expr) ){.    int
b850: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70   idxNew;.    Exp
b860: 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66  r *pRight, *pLef
b870: 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  t;.    WhereTerm
b880: 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20   *pNewTerm;.    
b890: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f  Bitmask prereqCo
b8a0: 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72  lumn, prereqExpr
b8b0: 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20  ;..    pRight = 
b8c0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
b8d0: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
b8e0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78  pLeft = pExpr->x
b8f0: 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
b900: 70 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78  pr;.    prereqEx
b910: 70 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  pr = exprTableUs
b920: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
b930: 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65  ight);.    prere
b940: 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61  qColumn = exprTa
b950: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
b960: 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  t, pLeft);.    i
b970: 66 28 20 28 70 72 65 72 65 71 45 78 70 72 20 26  f( (prereqExpr &
b980: 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d   prereqColumn)==
b990: 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
b9a0: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20  *pNewExpr;.     
b9b0: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
b9c0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
b9d0: 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20   TK_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 20 20 30 2c 20 73 71 6c            0, sql
ba00: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
ba10: 70 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a  pRight, 0), 0);.
ba20: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
ba30: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
ba40: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
ba50: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
ba60: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
ba70: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
ba80: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ew==0 );.      p
ba90: 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e  NewTerm = &pWC->
baa0: 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
bab0: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
bac0: 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 45  qRight = prereqE
bad0: 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  xpr;.      pNewT
bae0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
baf0: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
bb00: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
bb10: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
bb20: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
bb30: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
bb40: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d  eOperator = WO_M
bb50: 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77  ATCH;.      pNew
bb60: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
bb70: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
bb80: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
bb90: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70  dxTerm];.      p
bba0: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
bbb0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
bbc0: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
bbd0: 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65  OPIED;.      pNe
bbe0: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  wTerm->prereqAll
bbf0: 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   = pTerm->prereq
bc00: 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  All;.    }.  }.#
bc10: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
bc20: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
bc30: 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  E */..#ifdef SQL
bc40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
bc50: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20 57  _OR_STAT4.  /* W
bc60: 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33  hen sqlite_stat3
bc70: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
bc80: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20  is available an 
bc90: 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a  operator of the.
bca0: 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20    ** form "x IS 
bcb0: 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f  NOT NULL" can so
bcc0: 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75  metimes be evalu
bcd0: 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69  ated more effici
bce0: 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78  ently.  ** as "x
bcf0: 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e  >NULL" if x is n
bd00: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
bd10: 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63  IMARY KEY.  So c
bd20: 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20  onstruct a.  ** 
bd30: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20  virtual term of 
bd40: 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a  that form..  **.
bd50: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
bd60: 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  he virtual term 
bd70: 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20 77  must be tagged w
bd80: 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20  ith TERM_VNULL. 
bd90: 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f   This.  ** TERM_
bda0: 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73  VNULL tag will s
bdb0: 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d  uppress the not-
bdc0: 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68  null check at th
bdd0: 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a  e beginning.  **
bde0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57   of the loop.  W
bdf0: 69 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f  ithout the TERM_
be00: 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20  VNULL flag, the 
be10: 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61  not-null check a
be20: 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74  t.  ** the start
be30: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c   of the loop wil
be40: 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65  l prevent any re
be50: 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67  sults from being
be60: 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a   returned..  */.
be70: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
be80: 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26  =TK_NOTNULL.   &
be90: 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  & pExpr->pLeft->
bea0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
beb0: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   && pExpr->pLeft
bec0: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20  ->iColumn>=0.   
bed0: 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
bee0: 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
bef0: 45 5f 53 74 61 74 33 29 0a 20 20 29 7b 0a 20 20  E_Stat3).  ){.  
bf00: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
bf10: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  ;.    Expr *pLef
bf20: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
bf30: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
bf40: 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
bf50: 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20  *pNewTerm;..    
bf60: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
bf70: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
bf80: 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20  TK_GT,.         
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
bfb0: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c  p(db, pLeft, 0),
bfc0: 0a 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 20 20 73 71 6c               sql
bfe0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
bff0: 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c  , TK_NULL, 0, 0,
c000: 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64   0), 0);..    id
c010: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
c020: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
c030: 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  ewExpr,.        
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55        TERM_VIRTU
c060: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c  AL|TERM_DYNAMIC|
c070: 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20  TERM_VNULL);.   
c080: 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20   if( idxNew ){. 
c090: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20       pNewTerm = 
c0a0: 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b  &pWC->a[idxNew];
c0b0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c0c0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
c0d0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c0e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
c0f0: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
c100: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e      pNewTerm->u.
c110: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
c120: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
c130: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
c140: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a  erator = WO_GT;.
c150: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c160: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
c170: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
c180: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
c190: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
c1a0: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
c1b0: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
c1c0: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
c1d0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c1e0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
c1f0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
c200: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
c210: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
c220: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
c230: 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74  */..  /* Prevent
c240: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
c250: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
c260: 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20  from being used 
c270: 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e  to drive.  ** an
c280: 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65   index for table
c290: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
c2a0: 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
c2b0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
c2c0: 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67  ight |= extraRig
c2d0: 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ht;.}../*.** Thi
c2e0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63  s function searc
c2f0: 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61 20  hes pList for a 
c300: 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68  entry that match
c310: 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  es the iCol-th c
c320: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65  olumn.** of inde
c330: 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
c340: 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73   such an express
c350: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74  ion is found, it
c360: 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  s index in pList
c370: 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65  ->a[] is returne
c380: 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72  d. If.** no expr
c390: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
c3a0: 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
c3b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
c3c0: 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50  indIndexCol(.  P
c3d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c3f0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
c400: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
c410: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
c420: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
c430: 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63  on list to searc
c440: 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65  h */.  int iBase
c450: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c460: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
c470: 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63   for table assoc
c480: 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20  iated with pIdx 
c490: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
c4a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c4b0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
c4c0: 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66   match column of
c4d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 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 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
c500: 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63  of index to matc
c510: 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
c520: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c530: 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
c540: 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f  oll[iCol];..  fo
c550: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
c560: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
c570: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
c580: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
c590: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
c5a0: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xpr);.    if( p-
c5b0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
c5c0: 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d      && p->iColum
c5d0: 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
c5e0: 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20  n[iCol].     && 
c5f0: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
c600: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f  .    ){.      Co
c610: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
c620: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
c630: 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  q(pParse, pList-
c640: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
c650: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
c660: 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69  Coll) && 0==sqli
c670: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
c680: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
c690: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
c6a0: 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
c6b0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
c6c0: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   -1;.}../*.** Re
c6d0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
c6e0: 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73   DISTINCT expres
c6f0: 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64  sion-list passed
c700: 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
c710: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64  gument.** is red
c720: 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20  undant..**.** A 
c730: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73  DISTINCT list is
c740: 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20 74 68   redundant if th
c750: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
c760: 69 6e 73 20 73 6f 6d 65 20 73 75 62 73 65 74 20  ins some subset 
c770: 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68  of.** columns th
c780: 61 74 20 61 72 65 20 75 6e 69 71 75 65 20 61 6e  at are unique an
c790: 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73  d non-null..*/.s
c7a0: 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74  tatic int isDist
c7b0: 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20  inctRedundant(. 
c7c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c7d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
c7e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c7f0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
c800: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
c810: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
c820: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
c830: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
c840: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
c850: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
c860: 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20 20   *pDistinct     
c870: 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
c880: 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20 74  set that needs t
c890: 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f  o be DISTINCT */
c8a0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
c8b0: 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
c8c0: 3b 0a 20 20 69 6e 74 20 69 3b 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 20 0a 20 20 69 6e 74 20 69 42 61 73 65      .  int iBase
c8f0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
c900: 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   is more than on
c910: 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73  e table or sub-s
c920: 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f  elect in the FRO
c930: 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a  M clause of.  **
c940: 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65   this query, the
c950: 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  n it will not be
c960: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f   possible to sho
c970: 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49  w that the DISTI
c980: 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65  NCT .  ** clause
c990: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
c9a0: 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
c9b0: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
c9c0: 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20  rn 0;.  iBase = 
c9d0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
c9e0: 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d  Cursor;.  pTab =
c9f0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
ca00: 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  pTab;..  /* If a
ca10: 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ny of the expres
ca20: 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20  sions is an IPK 
ca30: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20  column on table 
ca40: 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75  iBase, then retu
ca50: 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e  rn .  ** true. N
ca60: 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61  ote: The (p->iTa
ca70: 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74  ble==iBase) part
ca80: 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d 61   of this test ma
ca90: 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74 68  y be false if th
caa0: 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53  e.  ** current S
cab0: 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72 65  ELECT is a corre
cac0: 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e  lated sub-query.
cad0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
cae0: 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45   i<pDistinct->nE
caf0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
cb00: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
cb10: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
cb20: 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e  pDistinct->a[i].
cb30: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
cb40: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
cb50: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
cb60: 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  Base && p->iColu
cb70: 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
cb80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  .  }..  /* Loop 
cb90: 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69  through all indi
cba0: 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
cbb0: 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20  , checking each 
cbc0: 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b  to see if it mak
cbd0: 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54  es.  ** the DIST
cbe0: 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72  INCT qualifier r
cbf0: 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65  edundant. It doe
cc00: 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20  s so if:.  **.  
cc10: 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65  **   1. The inde
cc20: 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51  x is itself UNIQ
cc30: 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a  UE, and.  **.  *
cc40: 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68  *   2. All of th
cc50: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
cc60: 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65   index are eithe
cc70: 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44  r part of the pD
cc80: 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20  istinct.  **    
cc90: 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20    list, or else 
cca0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
ccb0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d   contains a term
ccc0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f   of the form "co
ccd0: 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20  l=X",.  **      
cce0: 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e  where X is a con
ccf0: 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65  stant value. The
cd00: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
cd10: 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  nces of the.  **
cd20: 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e        comparison
cd30: 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74   and select-list
cd40: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
cd50: 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66  t match those of
cd60: 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a   the index..  **
cd70: 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f  .  **   3. All o
cd80: 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f  f those index co
cd90: 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20  lumns for which 
cda0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
cdb0: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20   does not.  **  
cdc0: 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63      contain a "c
cdd0: 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73  ol=X" term are s
cde0: 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20  ubject to a NOT 
cdf0: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e  NULL constraint.
ce00: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
ce10: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
ce20: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
ce30: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
ce40: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
ce50: 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  E_None ) continu
ce60: 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e;.    for(i=0; 
ce70: 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  i<pIdx->nKeyCol;
ce80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 31 36   i++){.      i16
ce90: 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69   iCol = pIdx->ai
cea0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
ceb0: 20 69 66 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d   if( 0==findTerm
cec0: 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f  (pWC, iBase, iCo
ced0: 6c 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20  l, ~(Bitmask)0, 
cee0: 57 4f 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a  WO_EQ, pIdx) ){.
cef0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78          int iIdx
cf00: 43 6f 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43  Col = findIndexC
cf10: 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ol(pParse, pDist
cf20: 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64  inct, iBase, pId
cf30: 78 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  x, i);.        i
cf40: 66 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20  f( iIdxCol<0 || 
cf50: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
cf60: 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  .notNull==0 ){. 
cf70: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
cf80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cf90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
cfa0: 69 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  i==pIdx->nKeyCol
cfb0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
cfc0: 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20  s index implies 
cfd0: 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43  that the DISTINC
cfe0: 54 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72  T qualifier is r
cff0: 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20  edundant. */.   
d000: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
d010: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
d020: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73   0;.}.../*.** Es
d030: 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72  timate the logar
d040: 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75  ithm of the inpu
d050: 74 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20  t value to base 
d060: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67  2..*/.static Log
d070: 45 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73  Est estLog(LogEs
d080: 74 20 4e 29 7b 0a 20 20 4c 6f 67 45 73 74 20 78  t N){.  LogEst x
d090: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
d0a0: 28 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20 78 3e  (N);.  return x>
d0b0: 33 33 20 3f 20 78 20 2d 20 33 33 20 3a 20 30 3b  33 ? x - 33 : 0;
d0c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f  .}../*.** Two ro
d0d0: 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74  utines for print
d0e0: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
d0f0: 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e  of an sqlite3_in
d100: 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75  dex_info.** stru
d110: 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72  cture.  Used for
d120: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
d130: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66  ugging only.  If
d140: 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49   neither.** SQLI
d150: 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54  TE_TEST or SQLIT
d160: 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69  E_DEBUG are defi
d170: 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20  ned, then these 
d180: 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20  routines.** are 
d190: 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21  no-ops..*/.#if !
d1a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
d1b0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
d1c0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 57 48 45  ) && defined(WHE
d1d0: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
d1e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
d1f0: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71  CE_IDX_INPUTS(sq
d200: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
d210: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
d220: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
d230: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
d240: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
d250: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
d260: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
d270: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63  DebugPrintf("  c
d280: 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63  onstraint[%d]: c
d290: 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20  ol=%d termid=%d 
d2a0: 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64  op=%d usabled=%d
d2b0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
d2c0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
d2d0: 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  aint[i].iColumn,
d2e0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
d2f0: 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f  traint[i].iTermO
d300: 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d  ffset,.       p-
d310: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
d320: 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  op,.       p->aC
d330: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
d340: 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ble);.  }.  for(
d350: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72  i=0; i<p->nOrder
d360: 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  By; i++){.    sq
d370: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
d380: 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a  ("  orderby[%d]:
d390: 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c   col=%d desc=%d\
d3a0: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
d3b0: 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
d3c0: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
d3d0: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
d3e0: 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a  i].desc);.  }.}.
d3f0: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
d400: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71  E_IDX_OUTPUTS(sq
d410: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
d420: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
d430: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
d440: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
d450: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
d460: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
d470: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
d480: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75  DebugPrintf("  u
d490: 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64  sage[%d]: argvId
d4a0: 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c  x=%d omit=%d\n",
d4b0: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
d4c0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
d4d0: 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
d4e0: 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  ex,.       p->aC
d4f0: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
d500: 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73  ].omit);.  }.  s
d510: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d520: 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e  f("  idxNum=%d\n
d530: 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20  ", p->idxNum);. 
d540: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d550: 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73  ntf("  idxStr=%s
d560: 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b  \n", p->idxStr);
d570: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
d580: 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79  rintf("  orderBy
d590: 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20  Consumed=%d\n", 
d5a0: 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  p->orderByConsum
d5b0: 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  ed);.  sqlite3De
d5c0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
d5d0: 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22  imatedCost=%g\n"
d5e0: 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  , p->estimatedCo
d5f0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  st);.  sqlite3De
d600: 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
d610: 69 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64 5c  imatedRows=%lld\
d620: 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64  n", p->estimated
d630: 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Rows);.}.#else.#
d640: 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
d650: 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69  _INPUTS(A).#defi
d660: 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  ne TRACE_IDX_OUT
d670: 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a  PUTS(A).#endif..
d680: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d690: 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
d6a0: 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  DEX./*.** Return
d6b0: 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45   TRUE if the WHE
d6c0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  RE clause term p
d6d0: 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72  Term is of a for
d6e0: 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f  m where it.** co
d6f0: 75 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68  uld be used with
d700: 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63   an index to acc
d710: 65 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69  ess pSrc, assumi
d720: 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ng an appropriat
d730: 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74  e.** index exist
d740: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
d750: 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  t termCanDriveIn
d760: 64 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d  dex(.  WhereTerm
d770: 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *pTerm,        
d780: 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
d790: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68  lause term to ch
d7a0: 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eck */.  struct 
d7b0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
d7c0: 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  rc,     /* Table
d7d0: 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
d7e0: 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69  o access */.  Bi
d7f0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20  tmask notReady  
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d810: 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20  Tables in outer 
d820: 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69  loops of the joi
d830: 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61  n */.){.  char a
d840: 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d  ff;.  if( pTerm-
d850: 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72  >leftCursor!=pSr
d860: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74  c->iCursor ) ret
d870: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
d880: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
d890: 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65 74   WO_EQ)==0 ) ret
d8a0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
d8b0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
d8c0: 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
d8d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
d8e0: 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  ( pTerm->u.leftC
d8f0: 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
d900: 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63   0;.  aff = pSrc
d910: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65  ->pTab->aCol[pTe
d920: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
d930: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66  ].affinity;.  if
d940: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
d950: 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d  ffinityOk(pTerm-
d960: 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72  >pExpr, aff) ) r
d970: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
d980: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 1;.}.#endif...
d990: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d9a0: 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
d9b0: 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  DEX./*.** Genera
d9c0: 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74  te code to const
d9d0: 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f  ruct the Index o
d9e0: 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74  bject for an aut
d9f0: 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20  omatic index.** 
da00: 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68  and to set up th
da10: 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a  e WhereLevel obj
da20: 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68  ect pLevel so th
da30: 61 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  at the code gene
da40: 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75  rator.** makes u
da50: 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61  se of the automa
da60: 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  tic index..*/.st
da70: 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72  atic void constr
da80: 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
da90: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
daa0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
dab0: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
dac0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
dad0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
dae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
daf0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
db00: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
db10: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a  _item *pSrc,  /*
db20: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
db30: 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65   term to get the
db40: 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20   next index */. 
db50: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
db60: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
db70: 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  Mask of cursors 
db80: 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61  that are not ava
db90: 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72  ilable */.  Wher
dba0: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20  eLevel *pLevel  
dbb0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
dbc0: 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65 20   new index here 
dbd0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65 79  */.){.  int nKey
dbe0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
dbf0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
dc00: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
dc10: 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65  constructed inde
dc20: 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  x */.  WhereTerm
dc30: 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
dc40: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
dc50: 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
dc60: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
dc70: 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20  reTerm *pWCEnd; 
dc80: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
dc90: 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20  of pWC->a[] */. 
dca0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dcc0: 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e  Object describin
dcd0: 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  g the transient 
dce0: 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20  index */.  Vdbe 
dcf0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
dd00: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72         /* Prepar
dd10: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
dd20: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
dd30: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69  */.  int addrIni
dd40: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
dd50: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
dd60: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
dd70: 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f  n bypass jump */
dd80: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
dd90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
dda0: 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
ddb0: 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  g indexed */.  i
ddc0: 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
ddd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
dde0: 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 66  p of the index f
ddf0: 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  ill loop */.  in
de00: 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20  t regRecord;    
de10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
de20: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e  ister holding an
de30: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f   index record */
de40: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de60: 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72  * Column counter
de70: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
dea0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74  r */.  int mxBit
deb0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
dec0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f     /* Maximum co
ded0: 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f  lumn in pSrc->co
dee0: 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53  lUsed */.  CollS
def0: 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
df00: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
df10: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
df20: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  on a column */. 
df30: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
df40: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
df50: 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  The Loop object 
df60: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55  */.  char *zNotU
df70: 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  sed;            
df80: 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20   /* Extra space 
df90: 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 70 49  on the end of pI
dfa0: 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  dx */.  Bitmask 
dfb0: 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  idxCols;        
dfc0: 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
dfd0: 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f   columns used fo
dfe0: 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20  r indexing */.  
dff0: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c  Bitmask extraCol
e000: 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  s;          /* B
e010: 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f  itmap of additio
e020: 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nal columns */. 
e030: 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20   u8 sentWarning 
e040: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
e050: 54 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69  True if a warnni
e060: 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73 73 75  ng has been issu
e070: 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  ed */..  /* Gene
e080: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
e090: 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
e0a0: 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
e0b0: 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
e0c0: 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
e0d0: 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
e0e0: 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
e0f0: 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
e100: 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
e110: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
e120: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64  t( v!=0 );.  add
e130: 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43  rInit = sqlite3C
e140: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
e150: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
e160: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
e170: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
e180: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
e190: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
e1a0: 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65  dex.  ** and use
e1b0: 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45  d to match WHERE
e1c0: 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
e1d0: 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c  nts */.  nKeyCol
e1e0: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d   = 0;.  pTable =
e1f0: 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70   pSrc->pTab;.  p
e200: 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b  WCEnd = &pWC->a[
e210: 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70  pWC->nTerm];.  p
e220: 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
e230: 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73  WLoop;.  idxCols
e240: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
e250: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
e260: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
e270: 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
e280: 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
e290: 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
e2a0: 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
e2b0: 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
e2c0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
e2d0: 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
e2e0: 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
e2f0: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
e300: 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
e310: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
e320: 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
e330: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
e340: 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
e350: 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67  if( !sentWarning
e360: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e370: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
e380: 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58  ARNING_AUTOINDEX
e390: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61  ,.            "a
e3a0: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f  utomatic index o
e3b0: 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c  n %s(%s)", pTabl
e3c0: 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  e->zName,.      
e3d0: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
e3e0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b  ol[iCol].zName);
e3f0: 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57 61 72  .        sentWar
e400: 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  ning = 1;.      
e410: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78  }.      if( (idx
e420: 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30  Cols & cMask)==0
e430: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e440: 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
e450: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f  pParse->db, pLoo
e460: 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 20  p, nKeyCol+1) ) 
e470: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
e480: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b  pLoop->aLTerm[nK
e490: 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d  eyCol++] = pTerm
e4a0: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
e4b0: 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
e4c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
e4d0: 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c 3e  assert( nKeyCol>
e4e0: 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e  0 );.  pLoop->u.
e4f0: 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f  btree.nEq = pLoo
e500: 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65 79  p->nLTerm = nKey
e510: 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  Col;.  pLoop->ws
e520: 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
e530: 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f  LUMN_EQ | WHERE_
e540: 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45  IDX_ONLY | WHERE
e550: 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20  _INDEXED.       
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
e570: 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
e580: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
e590: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69  e number of addi
e5a0: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e  tional columns n
e5b0: 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65 20  eeded to create 
e5c0: 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20  a.  ** covering 
e5d0: 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72  index.  A "cover
e5e0: 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e  ing index" is an
e5f0: 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
e600: 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f  ains all.  ** co
e610: 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e  lumns that are n
e620: 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75 65  eeded by the que
e630: 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65  ry.  With a cove
e640: 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a  ring index, the.
e650: 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61    ** original ta
e660: 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20  ble never needs 
e670: 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 20  to be accessed. 
e680: 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63   Automatic indic
e690: 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  es must.  ** be 
e6a0: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
e6b0: 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e 64   because the ind
e6c0: 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  ex will not be u
e6d0: 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20 20  pdated if the.  
e6e0: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  ** original tabl
e6f0: 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68  e changes and th
e700: 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
e710: 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65  e cannot both be
e720: 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68   used.  ** if th
e730: 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e  ey go out of syn
e740: 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43  c..  */.  extraC
e750: 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  ols = pSrc->colU
e760: 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20  sed & (~idxCols 
e770: 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  | MASKBIT(BMS-1)
e780: 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20  );.  mxBitCol = 
e790: 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d  (pTable->nCol >=
e7a0: 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20   BMS-1) ? BMS-1 
e7b0: 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a  : pTable->nCol;.
e7c0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
e7d0: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  le->nCol==BMS-1 
e7e0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
e7f0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
e800: 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  -2 );.  for(i=0;
e810: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
e820: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
e830: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
e840: 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20  ) ) nKeyCol++;. 
e850: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
e860: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
e870: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e  (BMS-1) ){.    n
e880: 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65  KeyCol += pTable
e890: 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31  ->nCol - BMS + 1
e8a0: 3b 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e 77  ;.  }.  pLoop->w
e8b0: 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
e8c0: 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52  COLUMN_EQ | WHER
e8d0: 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f  E_IDX_ONLY;..  /
e8e0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
e8f0: 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20  Index object to 
e900: 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e  describe this in
e910: 64 65 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20  dex */.  pIdx = 
e920: 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49  sqlite3AllocateI
e930: 6e 64 65 78 4f 62 6a 65 63 74 28 70 50 61 72 73  ndexObject(pPars
e940: 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31  e->db, nKeyCol+1
e950: 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b  , 0, &zNotUsed);
e960: 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29  .  if( pIdx==0 )
e970: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 6f 70   return;.  pLoop
e980: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
e990: 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d   = pIdx;.  pIdx-
e9a0: 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69  >zName = "auto-i
e9b0: 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 70  ndex";.  pIdx->p
e9c0: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
e9d0: 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f    n = 0;.  idxCo
e9e0: 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54  ls = 0;.  for(pT
e9f0: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
ea00: 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
ea10: 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d  +){.    if( term
ea20: 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
ea30: 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  erm, pSrc, notRe
ea40: 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  ady) ){.      in
ea50: 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e  t iCol = pTerm->
ea60: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
ea70: 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73      Bitmask cMas
ea80: 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20  k = iCol>=BMS ? 
ea90: 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a  MASKBIT(BMS-1) :
eaa0: 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a   MASKBIT(iCol);.
eab0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
eac0: 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  iCol==BMS-1 );. 
ead0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
eae0: 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
eaf0: 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26    if( (idxCols &
eb00: 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20   cMask)==0 ){.  
eb10: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d        Expr *pX =
eb20: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
eb30: 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c         idxCols |
eb40: 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20  = cMask;.       
eb50: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
eb60: 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  n] = pTerm->u.le
eb70: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
eb80: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
eb90: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
eba0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
ebb0: 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
ebc0: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49  ght);.        pI
ebd0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
ebe0: 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20  ALWAYS(pColl) ? 
ebf0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22  pColl->zName : "
ec00: 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20  BINARY";.       
ec10: 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   n++;.      }.  
ec20: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
ec30: 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d  ( (u32)n==pLoop-
ec40: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a  >u.btree.nEq );.
ec50: 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69  .  /* Add additi
ec60: 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  onal columns nee
ec70: 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ded to make the 
ec80: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
ec90: 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65  into.  ** a cove
eca0: 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ring index */.  
ecb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74  for(i=0; i<mxBit
ecc0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
ecd0: 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d  f( extraCols & M
ece0: 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20  ASKBIT(i) ){.   
ecf0: 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
ed00: 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[n] = i;.      
ed10: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
ed20: 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
ed30: 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
ed40: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
ed50: 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42  Used & MASKBIT(B
ed60: 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72  MS-1) ){.    for
ed70: 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62  (i=BMS-1; i<pTab
ed80: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  le->nCol; i++){.
ed90: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
eda0: 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
edb0: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
edc0: 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  n] = "BINARY";. 
edd0: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
ede0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d    }.  assert( n=
edf0: 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70 49  =nKeyCol );.  pI
ee00: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
ee10: 3d 20 2d 31 3b 0a 20 20 70 49 64 78 2d 3e 61 7a  = -1;.  pIdx->az
ee20: 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
ee30: 59 22 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  Y";..  /* Create
ee40: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
ee50: 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74  ndex */.  assert
ee60: 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ( pLevel->iIdxCu
ee70: 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c  r>=0 );.  pLevel
ee80: 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72  ->iIdxCur = pPar
ee90: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71  se->nTab++;.  sq
eea0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
eeb0: 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e  v, OP_OpenAutoin
eec0: 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  dex, pLevel->iId
eed0: 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29  xCur, nKeyCol+1)
eee0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  ;.  sqlite3VdbeS
eef0: 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
ef00: 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64 62  se, pIdx);.  Vdb
ef10: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f  eComment((v, "fo
ef20: 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  r %s", pTable->z
ef30: 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69  Name));..  /* Fi
ef40: 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ll the automatic
ef50: 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74   index with cont
ef60: 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  ent */.  addrTop
ef70: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ef80: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
ef90: 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  d, pLevel->iTabC
efa0: 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ur); VdbeCoverag
efb0: 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  e(v);.  regRecor
efc0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
efd0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
efe0: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
eff0: 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
f000: 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69   pIdx, pLevel->i
f010: 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72  TabCur, regRecor
f020: 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d, 0, 0, 0, 0);.
f030: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f040: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
f050: 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
f060: 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
f070: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
f080: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
f090: 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
f0a0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
f0b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
f0c0: 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
f0d0: 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56  r, addrTop+1); V
f0e0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
f0f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
f100: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
f110: 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49  STMTSTATUS_AUTOI
f120: 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33  NDEX);.  sqlite3
f130: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
f140: 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
f150: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
f160: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
f170: 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75  ord);.  .  /* Ju
f180: 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69  mp here when ski
f190: 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
f1a0: 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  lization */.  sq
f1b0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
f1c0: 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a  e(v, addrInit);.
f1d0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
f1e0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
f1f0: 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e  C_INDEX */..#ifn
f200: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f210: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
f220: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
f230: 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69  populate an sqli
f240: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
f250: 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20  tructure. It is 
f260: 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
f270: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
f280: 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
f290: 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73  ly release the s
f2a0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70  tructure.** by p
f2b0: 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74  assing the point
f2c0: 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
f2d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
f2e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
f2f0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
f300: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c  3_index_info *al
f310: 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
f320: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f330: 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ,.  WhereClause 
f340: 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53  *pWC,.  struct S
f350: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
f360: 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c,.  ExprList *p
f370: 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74  OrderBy.){.  int
f380: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65   i, j;.  int nTe
f390: 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  rm;.  struct sql
f3a0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
f3b0: 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
f3c0: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
f3d0: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
f3e0: 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
f3f0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
f400: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
f410: 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
f420: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
f430: 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
f440: 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
f450: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
f460: 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  o;..  /* Count t
f470: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
f480: 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
f490: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
f4a0: 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f  eferring.  ** to
f4b0: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
f4c0: 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ble */.  for(i=n
f4d0: 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
f4e0: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
f4f0: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
f500: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
f510: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
f520: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
f530: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
f540: 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
f550: 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
f560: 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
f570: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
f580: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
f590: 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
f5a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
f5b0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
f5c0: 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
f5d0: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
f5e0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
f5f0: 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ALL );.    if( (
f600: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f610: 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57   & ~(WO_ISNULL|W
f620: 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63  O_EQUIV))==0 ) c
f630: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
f640: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
f650: 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63  & TERM_VNULL ) c
f660: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65  ontinue;.    nTe
f670: 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rm++;.  }..  /* 
f680: 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  If the ORDER BY 
f690: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
f6a0: 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  only columns in 
f6b0: 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a  the current .  *
f6c0: 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * virtual table 
f6d0: 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70  then allocate sp
f6e0: 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64  ace for the aOrd
f6f0: 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a  erBy part of.  *
f700: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  * the sqlite3_in
f710: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
f720: 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65  re..  */.  nOrde
f730: 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rBy = 0;.  if( p
f740: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
f750: 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d  nt n = pOrderBy-
f760: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28  >nExpr;.    for(
f770: 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
f780: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
f790: 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  r = pOrderBy->a[
f7a0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
f7b0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
f7c0: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70  K_COLUMN || pExp
f7d0: 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d  r->iTable!=pSrc-
f7e0: 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  >iCursor ) break
f7f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f800: 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72  i==n){.      nOr
f810: 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d  derBy = n;.    }
f820: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
f830: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ate the sqlite3_
f840: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
f850: 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78  ture.  */.  pIdx
f860: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
f870: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
f880: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
f890: 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20  IdxInfo).       
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8b0: 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70      + (sizeof(*p
f8c0: 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f  IdxCons) + sizeo
f8d0: 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72  f(*pUsage))*nTer
f8e0: 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m.              
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
f900: 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72  izeof(*pIdxOrder
f910: 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a  By)*nOrderBy );.
f920: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
f930: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
f940: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f950: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
f960: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
f970: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
f980: 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74  alize the struct
f990: 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ure.  The sqlite
f9a0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
f9b0: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a  ucture contains.
f9c0: 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73    ** many fields
f9d0: 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72   that are declar
f9e0: 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72  ed "const" to pr
f9f0: 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78  event xBestIndex
fa00: 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67   from.  ** chang
fa10: 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61  ing them.  We ha
fa20: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75  ve to do some fu
fa30: 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f  nky casting in o
fa40: 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69  rder to.  ** ini
fa50: 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69  tialize those fi
fa60: 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64  elds..  */.  pId
fa70: 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20  xCons = (struct 
fa80: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
fa90: 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49  nstraint*)&pIdxI
faa0: 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72  nfo[1];.  pIdxOr
fab0: 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20  derBy = (struct 
fac0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
fad0: 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73  derby*)&pIdxCons
fae0: 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67  [nTerm];.  pUsag
faf0: 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  e = (struct sqli
fb00: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
fb10: 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64  aint_usage*)&pId
fb20: 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42  xOrderBy[nOrderB
fb30: 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  y];.  *(int*)&pI
fb40: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
fb50: 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a  int = nTerm;.  *
fb60: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
fb70: 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64  >nOrderBy = nOrd
fb80: 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
fb90: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
fba0: 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
fbb0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
fbc0: 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20  nt = pIdxCons;. 
fbd0: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
fbe0: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
fbf0: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72  *)&pIdxInfo->aOr
fc00: 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65  derBy = pIdxOrde
fc10: 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
fc20: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
fc30: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a  nstraint_usage**
fc40: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
fc50: 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20  straintUsage =. 
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: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fca0: 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72    pUsage;..  for
fcb0: 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57  (i=j=0, pTerm=pW
fcc0: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
fcd0: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
fce0: 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20  ){.    u8 op;.  
fcf0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
fd00: 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
fd10: 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
fd20: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
fd30: 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
fd40: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
fd50: 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
fd60: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
fd70: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
fd80: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
fd90: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
fda0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
fdb0: 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
fdc0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
fdd0: 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29  rator & WO_ALL )
fde0: 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
fdf0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28  ->eOperator & ~(
fe00: 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55  WO_ISNULL|WO_EQU
fe10: 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IV))==0 ) contin
fe20: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
fe30: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
fe40: 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
fe50: 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  ue;.    pIdxCons
fe60: 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54  [j].iColumn = pT
fe70: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
fe80: 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  n;.    pIdxCons[
fe90: 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d  j].iTermOffset =
fea0: 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38   i;.    op = (u8
feb0: 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  )pTerm->eOperato
fec0: 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20  r & WO_ALL;.    
fed0: 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20  if( op==WO_IN ) 
fee0: 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20  op = WO_EQ;.    
fef0: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
ff00: 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20   op;.    /* The 
ff10: 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e  direct assignmen
ff20: 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
ff30: 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62  s line is possib
ff40: 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a  le only because.
ff50: 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61      ** the WO_ a
ff60: 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  nd SQLITE_INDEX_
ff70: 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65  CONSTRAINT_ code
ff80: 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  s are identical.
ff90: 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c    The.    ** fol
ffa0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76  lowing asserts v
ffb0: 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e  erify this fact.
ffc0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ffd0: 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_EQ==SQLITE_IN
ffe0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
fff0: 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
10000 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_LT==SQLITE_I
10010 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
10020 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LT );.    assert
10030 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_LE==SQLITE_
10040 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
10050 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LE );.    asser
10060 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45  t( WO_GT==SQLITE
10070 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
10080 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65  T_GT );.    asse
10090 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54  rt( WO_GE==SQLIT
100a0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
100b0 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73  NT_GE );.    ass
100c0 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53  ert( WO_MATCH==S
100d0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
100e0 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a  TRAINT_MATCH );.
100f0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
10100 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
10110 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c  WO_IN|WO_EQ|WO_L
10120 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
10130 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b  _GE|WO_MATCH) );
10140 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
10150 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
10160 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  rBy; i++){.    E
10170 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
10180 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
10190 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  r;.    pIdxOrder
101a0 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  By[i].iColumn = 
101b0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
101c0 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
101d0 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72  i].desc = pOrder
101e0 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
101f0 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  er;.  }..  retur
10200 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f  n pIdxInfo;.}../
10210 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  *.** The table o
10220 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20  bject reference 
10230 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
10240 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
10250 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
10260 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74  * must represent
10270 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
10280 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
10290 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73  invokes the xBes
102a0 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68  tIndex().** meth
102b0 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  od of the virtua
102c0 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  l table with the
102d0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
102e0 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
102f0 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74  ** comes in as t
10300 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20  he 3rd argument 
10310 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
10320 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
10330 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72  ror occurs, pPar
10340 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  se is populated 
10350 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65  with an error me
10360 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e  ssage and a.** n
10370 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
10380 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
10390 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72  wise, 0 is retur
103a0 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70  ned and the outp
103b0 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  ut.** part of th
103c0 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
103d0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
103e0 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64  s left populated
103f0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
10400 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20  or not an error 
10410 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20  is returned, it 
10420 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
10430 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20  ility of the.** 
10440 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
10450 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78  ally free p->idx
10460 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f  Str if p->needTo
10470 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63  FreeIdxStr indic
10480 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69  ates.** that thi
10490 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  s is required..*
104a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61  /.static int vta
104b0 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65  bBestIndex(Parse
104c0 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
104d0 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69  *pTab, sqlite3_i
104e0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
104f0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
10500 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65  Vtab = sqlite3Ge
10510 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  tVTable(pParse->
10520 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62  db, pTab)->pVtab
10530 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
10540 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44   rc;..  TRACE_ID
10550 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72  X_INPUTS(p);.  r
10560 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  c = pVtab->pModu
10570 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70  le->xBestIndex(p
10580 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43  Vtab, p);.  TRAC
10590 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29  E_IDX_OUTPUTS(p)
105a0 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  ;..  if( rc!=SQL
105b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
105c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
105d0 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  EM ){.      pPar
105e0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
105f0 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  iled = 1;.    }e
10600 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e  lse if( !pVtab->
10610 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
10620 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10630 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73  (pParse, "%s", s
10640 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
10650 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10660 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10670 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
10680 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
10690 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
106a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
106b0 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
106c0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
106d0 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
106e0 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
106f0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   i++){.    if( !
10700 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
10710 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61  ].usable && p->a
10720 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
10730 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29  i].argvIndex>0 )
10740 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
10750 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10760 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c  .          "tabl
10770 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78  e %s: xBestIndex
10780 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76   returned an inv
10790 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62  alid plan", pTab
107a0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
107b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50    }..  return pP
107c0 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65  arse->nErr;.}.#e
107d0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
107e0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
107f0 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a  TUALTABLE) */...
10800 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10810 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
10820 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
10830 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  te the location 
10840 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  of a particular 
10850 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65  key among all ke
10860 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65  ys in an.** inde
10870 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65  x.  Store the re
10880 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61  sults in aStat a
10890 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
108a0 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20      aStat[0]    
108b0 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
108c0 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   rows less than 
108d0 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74  pVal.**    aStat
108e0 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [1]      Est. nu
108f0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75  mber of rows equ
10900 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a  al to pVal.**.**
10910 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
10920 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f  K on success..*/
10930 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
10940 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61  reKeyStats(.  Pa
10950 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
10970 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10980 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
10990 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
109a0 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f    /* Index to co
109b0 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66  nsider domain of
109c0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
109d0 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20  cord *pRec,     
109e0 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76    /* Vector of v
109f0 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65  alues to conside
10a00 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64  r */.  int round
10a10 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Up,             
10a20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69     /* Round up i
10a30 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64  f true.  Round d
10a40 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a  own if false */.
10a50 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74    tRowcnt *aStat
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a70 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74   OUT: stats writ
10a80 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
10a90 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53   IndexSample *aS
10aa0 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53  ample = pIdx->aS
10ab0 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f  ample;.  int iCo
10ac0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
10ad0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
10ae0 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73 20   required stats 
10af0 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a  in anEq[] etc. *
10b00 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30  /.  int iMin = 0
10b10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10b20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70  /* Smallest samp
10b30 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65  le not yet teste
10b40 64 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  d */.  int i = p
10b50 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20 20  Idx->nSample;   
10b60 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73     /* Smallest s
10b70 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61  ample larger tha
10b80 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52  n or equal to pR
10b90 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73  ec */.  int iTes
10ba0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
10bb0 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70      /* Next samp
10bc0 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20  le to test */.  
10bd0 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
10be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10bf0 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
10c00 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  son operation */
10c10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10c20 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f  _DEBUG.  UNUSED_
10c30 50 41 52 41 4d 45 54 45 52 28 20 70 50 61 72 73  PARAMETER( pPars
10c40 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  e );.#endif.  as
10c50 73 65 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b  sert( pRec!=0 );
10c60 0a 20 20 69 43 6f 6c 20 3d 20 70 52 65 63 2d 3e  .  iCol = pRec->
10c70 6e 46 69 65 6c 64 20 2d 20 31 3b 0a 20 20 61 73  nField - 1;.  as
10c80 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d  sert( pIdx->nSam
10c90 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ple>0 );.  asser
10ca0 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e  t( pRec->nField>
10cb0 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e  0 && iCol<pIdx->
10cc0 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 20 20  nSampleCol );.  
10cd0 64 6f 7b 0a 20 20 20 20 69 54 65 73 74 20 3d 20  do{.    iTest = 
10ce0 28 69 4d 69 6e 2b 69 29 2f 32 3b 0a 20 20 20 20  (iMin+i)/2;.    
10cf0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
10d00 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
10d10 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 6e 2c  Sample[iTest].n,
10d20 20 61 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e   aSample[iTest].
10d30 70 2c 20 70 52 65 63 2c 20 30 29 3b 0a 20 20 20  p, pRec, 0);.   
10d40 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
10d50 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74      iMin = iTest
10d60 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
10d70 20 20 20 20 20 69 20 3d 20 69 54 65 73 74 3b 0a       i = iTest;.
10d80 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
10d90 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 20 29 3b  res && iMin<i );
10da0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
10db0 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66  DEBUG.  /* The f
10dc0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
10dd0 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b  statements check
10de0 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72 79   that the binary
10df0 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a   search code.  *
10e00 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68  * above found th
10e10 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20  e right answer. 
10e20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
10e30 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68  s no purpose oth
10e40 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20  er.  ** than to 
10e50 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72  invoke the asser
10e60 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  ts.  */.  if( re
10e70 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  s==0 ){.    /* I
10e80 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72  f (res==0) is tr
10e90 75 65 2c 20 74 68 65 6e 20 73 61 6d 70 6c 65 20  ue, then sample 
10ea0 24 69 20 6d 75 73 74 20 62 65 20 65 71 75 61 6c  $i must be equal
10eb0 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 20 20   to pRec */.    
10ec0 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e  assert( i<pIdx->
10ed0 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 61  nSample );.    a
10ee0 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
10ef0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
10f00 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  re(aSample[i].n,
10f10 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70   aSample[i].p, p
10f20 52 65 63 2c 20 30 29 0a 20 20 20 20 20 20 20 20  Rec, 0).        
10f30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
10f40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
10f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
10f60 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65 63 20  Otherwise, pRec 
10f70 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20  must be smaller 
10f80 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20 61  than sample $i a
10f90 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20  nd larger than. 
10fa0 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24 69     ** sample ($i
10fb0 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  -1).  */.    ass
10fc0 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  ert( i==pIdx->nS
10fd0 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20  ample .         
10fe0 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  || sqlite3VdbeRe
10ff0 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
11000 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
11010 65 5b 69 5d 2e 70 2c 20 70 52 65 63 2c 20 30 29  e[i].p, pRec, 0)
11020 3e 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  >0.         || p
11030 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
11040 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61  cFailed );.    a
11050 73 73 65 72 74 28 20 69 3d 3d 30 0a 20 20 20 20  ssert( i==0.    
11060 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
11070 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
11080 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c  (aSample[i-1].n,
11090 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c   aSample[i-1].p,
110a0 20 70 52 65 63 2c 20 30 29 3c 30 0a 20 20 20 20   pRec, 0)<0.    
110b0 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
110c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
110d0 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   );.  }.#endif /
110e0 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  * ifdef SQLITE_D
110f0 45 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a 20 41 74  EBUG */..  /* At
11100 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53 61   this point, aSa
11110 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66  mple[i] is the f
11120 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74  irst sample that
11130 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
11140 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20 74  .  ** or equal t
11150 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20 69  o pVal.  Or if i
11160 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c  ==pIdx->nSample,
11170 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c 65   then all sample
11180 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a 20  s are less.  ** 
11190 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20 61  than pVal.  If a
111a0 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c  Sample[i]==pVal,
111b0 20 74 68 65 6e 20 72 65 73 3d 3d 30 2e 0a 20 20   then res==0..  
111c0 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  */.  if( res==0 
111d0 29 7b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20  ){.    aStat[0] 
111e0 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c  = aSample[i].anL
111f0 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74  t[iCol];.    aSt
11200 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b  at[1] = aSample[
11210 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20  i].anEq[iCol];. 
11220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77   }else{.    tRow
11230 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70  cnt iLower, iUpp
11240 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66  er, iGap;.    if
11250 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i==0 ){.      
11260 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20  iLower = 0;.    
11270 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70    iUpper = aSamp
11280 6c 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d  le[0].anLt[iCol]
11290 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
112a0 20 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73     i64 nRow0 = s
112b0 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
112c0 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67  t(pIdx->aiRowLog
112d0 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69  Est[0]);.      i
112e0 55 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d  Upper = i>=pIdx-
112f0 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 52 6f 77 30  >nSample ? nRow0
11300 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   : aSample[i].an
11310 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  Lt[iCol];.      
11320 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65  iLower = aSample
11330 5b 69 2d 31 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d  [i-1].anEq[iCol]
11340 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e   + aSample[i-1].
11350 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
11360 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d  }.    aStat[1] =
11370 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e   (pIdx->nKeyCol>
11380 69 43 6f 6c 20 3f 20 70 49 64 78 2d 3e 61 41 76  iCol ? pIdx->aAv
11390 67 45 71 5b 69 43 6f 6c 5d 20 3a 20 31 29 3b 0a  gEq[iCol] : 1);.
113a0 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d      if( iLower>=
113b0 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20  iUpper ){.      
113c0 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65  iGap = 0;.    }e
113d0 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
113e0 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  = iUpper - iLowe
113f0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
11400 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20   roundUp ){.    
11410 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32    iGap = (iGap*2
11420 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )/3;.    }else{.
11430 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61        iGap = iGa
11440 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  p/3;.    }.    a
11450 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72  Stat[0] = iLower
11460 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 7d 0a 23   + iGap;.  }.}.#
11470 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11480 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
11490 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT4 */../*.** 
114a0 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  If it is not NUL
114b0 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20 74 65  L, pTerm is a te
114c0 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  rm that provides
114d0 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f 77   an upper or low
114e0 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 61  er.** bound on a
114f0 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57 69 74   range scan. Wit
11500 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69 6e 67  hout considering
11510 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20 65 73   pTerm, it is es
11520 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61 74  timated .** that
11530 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76   the scan will v
11540 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e 20  isit nNew rows. 
11550 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
11560 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
11570 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f  .** estimated to
11580 20 62 65 20 76 69 73 69 74 65 64 20 61 66 74 65   be visited afte
11590 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d 20 69  r taking pTerm i
115a0 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a  nto account..**.
115b0 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 65  ** If the user e
115c0 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
115d0 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64  ied a likelihood
115e0 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  () value for thi
115f0 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20  s term,.** then 
11600 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
11610 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f   is the likeliho
11620 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79  od multiplied by
11630 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
11640 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f 74  * input rows. Ot
11650 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 66 75  herwise, this fu
11660 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
11670 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54 20 4e  hat an "IS NOT N
11680 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61 73  ULL" term.** has
11690 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66   a likelihood of
116a0 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20 6f   0.50, and any o
116b0 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69 6b 65  ther term a like
116c0 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e 0a  lihood of 0.25..
116d0 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
116e0 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73   whereRangeAdjus
116f0 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  t(WhereTerm *pTe
11700 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77 29  rm, LogEst nNew)
11710 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65 74 20  {.  LogEst nRet 
11720 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70 54  = nNew;.  if( pT
11730 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70  erm ){.    if( p
11740 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
11750 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74  =0 ){.      nRet
11760 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
11770 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Prob;.    }else 
11780 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  if( (pTerm->wtFl
11790 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
117a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  )==0 ){.      nR
117b0 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20  et -= 20;       
117c0 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
117d0 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
117e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
117f0 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn nRet;.}../*.
11800 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11810 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
11820 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
11830 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
11840 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
11850 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
11860 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
11870 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
11880 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
11890 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
118a0 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
118b0 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
118c0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
118d0 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
118e0 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
118f0 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
11900 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
11910 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
11920 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
11930 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
11940 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
11950 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
11960 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
11970 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
11980 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119a0 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
119b0 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
119d0 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
11a00 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
11a10 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
11a20 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
11a30 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
11a40 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
11a50 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
11a60 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
11a70 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
11a80 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  ** The value in 
11a90 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d  (pBuilder->pNew-
11aa0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73  >u.btree.nEq) is
11ab0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
11ac0 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d  e index.** colum
11ad0 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  n subject to the
11ae0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
11af0 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e  t. Or, equivalen
11b00 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  tly, the number 
11b10 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63  of.** equality c
11b20 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d  onstraints optim
11b30 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70  ized by the prop
11b40 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e  osed index scan.
11b50 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a   For example,.**
11b60 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20   assuming index 
11b70 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29  p is on t1(a, b)
11b80 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75  , and the SQL qu
11b90 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
11ba0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
11bb0 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20  E a = ? AND b > 
11bc0 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a  ? AND b < ? ....
11bd0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69  **.** then nEq i
11be0 73 20 73 65 74 20 74 6f 20 31 20 28 61 73 20 74  s set to 1 (as t
11bf0 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63  he range restric
11c00 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69  ted column, b, i
11c10 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
11c20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
11c30 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e  n of the index).
11c40 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72   Or, if the quer
11c50 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
11c60 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
11c70 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
11c80 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e  ....**.** then n
11c90 45 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  Eq is set to 0..
11ca0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
11cb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
11cc0 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65  ed, *pnOut is se
11cd0 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  t to the sqlite3
11ce0 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a  LogEst() of the.
11cf0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
11d00 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  s that the index
11d10 20 73 63 61 6e 20 69 73 20 65 78 70 65 63 74 65   scan is expecte
11d20 64 20 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f  d to visit witho
11d30 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69  ut .** consideri
11d40 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  ng the range con
11d50 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71  straints. If nEq
11d60 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 74   is 0, this is t
11d70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  he number of .**
11d80 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
11d90 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20  ex. Assuming no 
11da0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
11db0 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65 64  nOut is adjusted
11dc0 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f   (reduced).** to
11dd0 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
11de0 20 72 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74   range contraint
11df0 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  s pLower and pUp
11e00 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74  per..** .** In t
11e10 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71  he absence of sq
11e20 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59  lite_stat4 ANALY
11e30 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73  ZE data, or if s
11e40 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20  uch data cannot 
11e50 62 65 0a 2a 2a 20 75 73 65 64 2c 20 65 61 63 68  be.** used, each
11e60 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74   range inequalit
11e70 79 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65  y reduces the se
11e80 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20  arch space by a 
11e90 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a  factor of 4. .**
11ea0 20 48 65 6e 63 65 20 61 20 70 61 69 72 20 6f 66   Hence a pair of
11eb0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e   constraints (x>
11ec0 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63  ? AND x<?) reduc
11ed0 65 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  es the expected 
11ee0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77  number of.** row
11ef0 73 20 76 69 73 69 74 65 64 20 62 79 20 61 20 66  s visited by a f
11f00 61 63 74 6f 72 20 6f 66 20 31 36 2e 0a 2a 2f 0a  actor of 16..*/.
11f10 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
11f20 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20  RangeScanEst(.  
11f30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11f40 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11f50 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
11f60 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
11f70 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
11f80 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65  *pBuilder,.  Whe
11f90 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20  reTerm *pLower, 
11fa0 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64    /* Lower bound
11fb0 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
11fc0 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74  x: "x>123" Might
11fd0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
11fe0 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c  ereTerm *pUpper,
11ff0 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e     /* Upper boun
12000 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
12010 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68  ex: "x<455" Migh
12020 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
12030 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
12040 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68      /* Modify th
12050 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62  e .nOut and mayb
12060 65 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a  e .rRun fields *
12070 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
12080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
12090 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e   nOut = pLoop->n
120a0 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e  Out;.  LogEst nN
120b0 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ew;..#ifdef SQLI
120c0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
120d0 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78  OR_STAT4.  Index
120e0 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   *p = pLoop->u.b
120f0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
12100 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
12110 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20  u.btree.nEq;..  
12120 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  if( p->nSample>0
12130 0a 20 20 20 26 26 20 6e 45 71 3d 3d 70 42 75 69  .   && nEq==pBui
12140 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 0a  lder->nRecValid.
12150 20 20 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61     && nEq<p->nSa
12160 6d 70 6c 65 43 6f 6c 0a 20 20 20 26 26 20 4f 70  mpleCol.   && Op
12170 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
12180 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
12190 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20 29  LITE_Stat3) .  )
121a0 7b 0a 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65  {.    UnpackedRe
121b0 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75  cord *pRec = pBu
121c0 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20  ilder->pRec;.   
121d0 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20   tRowcnt a[2];. 
121e0 20 20 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20     u8 aff;..    
121f0 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77  /* Variable iLow
12200 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  er will be set t
12210 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
12220 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
12230 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20  rows in .    ** 
12240 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61  the index that a
12250 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  re less than the
12260 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20   lower bound of 
12270 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
12280 20 54 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77 65   The.    ** lowe
12290 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68  r bound being th
122a0 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20  e concatenation 
122b0 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68  of $P and $L, wh
122c0 65 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20  ere $P is the.  
122d0 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20    ** key-prefix 
122e0 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45  formed by the nE
122f0 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64  q values matched
12300 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71   against the nEq
12310 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 2a   left-most.    *
12320 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  * columns of the
12330 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69   index, and $L i
12340 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  s the value in p
12350 4c 6f 77 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20  Lower..    **.  
12360 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77    ** Or, if pLow
12370 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c  er is NULL or $L
12380 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
12390 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65  cted from it (be
123a0 63 61 75 73 65 20 69 74 0a 20 20 20 20 2a 2a 20  cause it.    ** 
123b0 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20  is not a simple 
123c0 76 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65  variable or lite
123d0 72 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20  ral value), the 
123e0 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  lower bound of t
123f0 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  he.    ** range 
12400 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20  is $P. Due to a 
12410 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79  quirk in the way
12420 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
12430 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20   works, even.   
12440 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61   ** if $L is ava
12450 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79  ilable, whereKey
12460 53 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65  Stats() is calle
12470 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20  d for both ($P) 
12480 61 6e 64 20 0a 20 20 20 20 2a 2a 20 28 24 50 3a  and .    ** ($P:
12490 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67  $L) and the larg
124a0 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65  er of the two re
124b0 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20 75 73  turned values us
124c0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
124d0 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70  * Similarly, iUp
124e0 70 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74  per is to be set
124f0 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
12500 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
12510 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 6c 65  f rows.    ** le
12520 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65  ss than the uppe
12530 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72  r bound of the r
12540 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65 72  ange query. Wher
12550 65 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  e the upper boun
12560 64 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68  d.    ** is eith
12570 65 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24  er ($P) or ($P:$
12580 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20  U). Again, even 
12590 69 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62  if $U is availab
125a0 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a  le, both values.
125b0 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72      ** of iUpper
125c0 20 61 72 65 20 72 65 71 75 65 73 74 65 64 20 6f   are requested o
125d0 66 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  f whereKeyStats(
125e0 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65  ) and the smalle
125f0 72 20 75 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  r used..    */. 
12600 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
12610 72 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69  r;.    tRowcnt i
12620 55 70 70 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Upper;..    if( 
12630 6e 45 71 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20  nEq==p->nKeyCol 
12640 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
12650 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
12660 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  R;.    }else{.  
12670 20 20 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61      aff = p->pTa
12680 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
12690 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69  olumn[nEq]].affi
126a0 6e 69 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nity;.    }.    
126b0 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f  /* Determine iLo
126c0 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75  wer and iUpper u
126d0 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20  sing ($P) only. 
126e0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d  */.    if( nEq==
126f0 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  0 ){.      iLowe
12700 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70  r = 0;.      iUp
12710 70 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  per = sqlite3Log
12720 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f  EstToInt(p->aiRo
12730 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20  wLogEst[0]);.   
12740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
12750 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c   Note: this call
12760 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69   could be optimi
12770 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65  zed away - since
12780 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73   the same values
12790 20 6d 75 73 74 20 0a 20 20 20 20 20 20 2a 2a 20   must .      ** 
127a0 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73  have been reques
127b0 74 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67  ted when testing
127c0 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72 65   key $P in where
127d0 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20  EqualScanEst(). 
127e0 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 4b   */.      whereK
127f0 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
12800 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
12810 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
12820 5b 30 5d 3b 0a 20 20 20 20 20 20 69 55 70 70 65  [0];.      iUppe
12830 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b  r = a[0] + a[1];
12840 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
12850 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72  f possible, impr
12860 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65  ove on the iLowe
12870 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67  r estimate using
12880 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20   ($P:$L). */.   
12890 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20   if( pLower ){. 
128a0 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20       int bOk;   
128b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128c0 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75   /* True if valu
128d0 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
128e0 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
128f0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
12900 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e   pLower->pExpr->
12910 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73  pRight;.      as
12920 73 65 72 74 28 20 28 70 4c 6f 77 65 72 2d 3e 65  sert( (pLower->e
12930 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47  Operator & (WO_G
12940 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a  T|WO_GE))!=0 );.
12950 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12960 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
12970 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
12980 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66  &pRec, pExpr, af
12990 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20  f, nEq, &bOk);. 
129a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
129b0 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b  ITE_OK && bOk ){
129c0 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74  .        tRowcnt
129d0 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 77   iNew;.        w
129e0 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
129f0 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
12a00 20 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4e 65   a);.        iNe
12a10 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f  w = a[0] + ((pLo
12a20 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  wer->eOperator &
12a30 20 57 4f 5f 47 54 29 20 3f 20 61 5b 31 5d 20 3a   WO_GT) ? a[1] :
12a40 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
12a50 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69   iNew>iLower ) i
12a60 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20  Lower = iNew;.  
12a70 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20        nOut--;.  
12a80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
12a90 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c   /* If possible,
12aa0 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20   improve on the 
12ab0 69 55 70 70 65 72 20 65 73 74 69 6d 61 74 65 20  iUpper estimate 
12ac0 75 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a  using ($P:$U). *
12ad0 2f 0a 20 20 20 20 69 66 28 20 70 55 70 70 65 72  /.    if( pUpper
12ae0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f   ){.      int bO
12af0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
12b00 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
12b10 20 76 61 6c 75 65 20 69 73 20 65 78 74 72 61 63   value is extrac
12b20 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
12b30 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  /.      Expr *pE
12b40 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45  xpr = pUpper->pE
12b50 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
12b60 20 20 20 61 73 73 65 72 74 28 20 28 70 55 70 70     assert( (pUpp
12b70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
12b80 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d  (WO_LT|WO_LE))!=
12b90 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
12ba0 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
12bb0 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
12bc0 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
12bd0 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f  r, aff, nEq, &bO
12be0 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
12bf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
12c00 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 74 52  Ok ){.        tR
12c10 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20  owcnt iNew;.    
12c20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74      whereKeyStat
12c30 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
12c40 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 1, a);.      
12c50 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20    iNew = a[0] + 
12c60 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61  ((pUpper->eOpera
12c70 74 6f 72 20 26 20 57 4f 5f 4c 45 29 20 3f 20 61  tor & WO_LE) ? a
12c80 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
12c90 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70 65    if( iNew<iUppe
12ca0 72 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e 65  r ) iUpper = iNe
12cb0 77 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 2d  w;.        nOut-
12cc0 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  -;.      }.    }
12cd0 0a 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ..    pBuilder->
12ce0 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20  pRec = pRec;.   
12cf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12d00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
12d10 69 55 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b  iUpper>iLower ){
12d20 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20  .        nNew = 
12d30 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55  sqlite3LogEst(iU
12d40 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a  pper - iLower);.
12d50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12d60 20 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20       nNew = 10; 
12d70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31         assert( 1
12d80 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
12d90 28 32 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (2) );.      }. 
12da0 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f       if( nNew<nO
12db0 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f  ut ){.        nO
12dc0 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  ut = nNew;.     
12dd0 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e   }.      pLoop->
12de0 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e  nOut = (LogEst)n
12df0 4f 75 74 3b 0a 20 20 20 20 20 20 57 48 45 52 45  Out;.      WHERE
12e00 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 72 61  TRACE(0x10, ("ra
12e10 6e 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73  nge scan regions
12e20 3a 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64  : %u..%u  est=%d
12e30 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
12e50 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29  32)iLower, (u32)
12e60 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a  iUpper, nOut));.
12e70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12e80 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
12e90 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  }.#else.  UNUSED
12ea0 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73  _PARAMETER(pPars
12eb0 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
12ec0 41 4d 45 54 45 52 28 70 42 75 69 6c 64 65 72 29  AMETER(pBuilder)
12ed0 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
12ee0 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70  t( pLower || pUp
12ef0 70 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  per );.  assert(
12f00 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70   pUpper==0 || (p
12f10 55 70 70 65 72 2d 3e 77 74 46 6c 61 67 73 20 26  Upper->wtFlags &
12f20 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
12f30 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72  );.  nNew = wher
12f40 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f  eRangeAdjust(pLo
12f50 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e  wer, nOut);.  nN
12f60 65 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41  ew = whereRangeA
12f70 64 6a 75 73 74 28 70 55 70 70 65 72 2c 20 6e 4e  djust(pUpper, nN
12f80 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e  ew);..  /* TUNIN
12f90 47 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 62  G: If there is b
12fa0 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64  oth an upper and
12fb0 20 6c 6f 77 65 72 20 6c 69 6d 69 74 2c 20 61 73   lower limit, as
12fc0 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65 20 69  sume the range i
12fd0 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64 20 62  s.  ** reduced b
12fe0 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  y an additional 
12ff0 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  75%. This means 
13000 74 68 61 74 2c 20 62 79 20 64 65 66 61 75 6c 74  that, by default
13010 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a  , an open-ended.
13020 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65 72 79    ** range query
13030 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20   (e.g. col > ?) 
13040 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 6d 61  is assumed to ma
13050 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65 20 72  tch 1/4 of the r
13060 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ows in the.  ** 
13070 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61 20 63  index. While a c
13080 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65 2e 67  losed range (e.g
13090 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20  . col BETWEEN ? 
130a0 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69 6d 61  AND ?) is estima
130b0 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63  ted to.  ** matc
130c0 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20 69 6e  h 1/64 of the in
130d0 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70  dex. */ .  if( p
130e0 4c 6f 77 65 72 20 26 26 20 70 55 70 70 65 72 20  Lower && pUpper 
130f0 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 0a 20  ) nNew -= 20;.. 
13100 20 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72   nOut -= (pLower
13110 21 3d 30 29 20 2b 20 28 70 55 70 70 65 72 21 3d  !=0) + (pUpper!=
13120 30 29 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31  0);.  if( nNew<1
13130 30 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20  0 ) nNew = 10;. 
13140 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29   if( nNew<nOut )
13150 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20   nOut = nNew;.  
13160 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c  pLoop->nOut = (L
13170 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65  ogEst)nOut;.  re
13180 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
13190 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
131a0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
131b0 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
131c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
131d0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
131e0 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
131f0 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20  .** an equality 
13200 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c  constraint x=VAL
13210 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61  UE and where tha
13220 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69  t VALUE occurs i
13230 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72  n.** the histogr
13240 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f  am data.  This o
13250 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78  nly works when x
13260 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   is the left-mos
13270 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  t.** column of a
13280 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69  n index and sqli
13290 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72  te_stat3 histogr
132a0 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  am data is avail
132b0 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74  able.** for that
132c0 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45   index.  When pE
132d0 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  xpr==NULL that m
132e0 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61  eans the constra
132f0 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20  int is.** "x IS 
13300 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66  NULL" instead of
13310 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a   "x=VALUE"..**.*
13320 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
13330 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
13340 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
13350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13360 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
13370 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
13380 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
13390 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
133a0 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
133b0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
133c0 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
133d0 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
133e0 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
133f0 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
13400 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
13410 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
13420 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
13430 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
13440 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
13450 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
13460 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
13470 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
13480 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
13490 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
134a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
134b0 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
134c0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
134d0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
134e0 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
134f0 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
13500 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
13510 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
13520 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
13530 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
13540 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69  sion for VALUE i
13550 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f  n the x=VALUE co
13560 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52  nstraint */.  tR
13570 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20  owcnt *pnRow    
13580 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
13590 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
135a0 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
135b0 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75    Index *p = pBu
135c0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
135d0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
135e0 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65  nt nEq = pBuilde
135f0 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
13600 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64  .nEq;.  Unpacked
13610 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
13620 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
13630 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20   u8 aff;        
13640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
13650 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f  lumn affinity */
13660 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13680 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  Subfunction retu
13690 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f  rn code */.  tRo
136a0 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20  wcnt a[2];      
136b0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73         /* Statis
136c0 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f  tics */.  int bO
136d0 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45  k;..  assert( nE
136e0 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  q>=1 );.  assert
136f0 28 20 6e 45 71 3c 3d 28 70 2d 3e 6e 4b 65 79 43  ( nEq<=(p->nKeyC
13700 6f 6c 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72  ol+1) );.  asser
13710 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
13720 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
13730 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
13740 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
13750 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20  ->nRecValid<nEq 
13760 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75  );..  /* If valu
13770 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  es are not avail
13780 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65  able for all fie
13790 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  lds of the index
137a0 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
137b0 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e  * of this one, n
137c0 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62  o estimate can b
137d0 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53  e made. Return S
137e0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20  QLITE_NOTFOUND. 
137f0 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
13800 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45  r->nRecValid<(nE
13810 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  q-1) ){.    retu
13820 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
13830 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ND;.  }..  /* Th
13840 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
13850 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20  ation only. The 
13860 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53  call to sqlite3S
13870 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
13880 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77  e().  ** below w
13890 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20  ould return the 
138a0 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a  same value.  */.
138b0 20 20 69 66 28 20 6e 45 71 3e 70 2d 3e 6e 4b 65    if( nEq>p->nKe
138c0 79 43 6f 6c 20 29 7b 0a 20 20 20 20 2a 70 6e 52  yCol ){.    *pnR
138d0 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ow = 1;.    retu
138e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
138f0 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54  }..  aff = p->pT
13900 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
13910 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61  Column[nEq-1]].a
13920 66 66 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d 20  ffinity;.  rc = 
13930 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
13940 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
13950 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
13960 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26  r, aff, nEq-1, &
13970 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72  bOk);.  pBuilder
13980 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20  ->pRec = pRec;. 
13990 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
139a0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
139b0 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72    if( bOk==0 ) r
139c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
139d0 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65  FOUND;.  pBuilde
139e0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
139f0 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53  Eq;..  whereKeyS
13a00 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
13a10 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57  pRec, 0, a);.  W
13a20 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
13a30 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72  "equality scan r
13a40 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28  egions: %d\n", (
13a50 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70  int)a[1]));.  *p
13a60 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a  nRow = a[1];.  .
13a70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
13a80 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13a90 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
13aa0 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66  STAT4 */..#ifdef
13ab0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
13ac0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
13ad0 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
13ae0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
13af0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
13b00 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
13b10 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  * an IN constrai
13b20 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67  nt where the rig
13b30 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
13b40 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
13b50 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ** is a list of 
13b60 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65  values.  Example
13b70 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57  :.**.**        W
13b80 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33  HERE x IN (1,2,3
13b90 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ,4).**.** Write 
13ba0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
13bb0 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
13bc0 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
13bd0 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
13be0 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
13bf0 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
13c00 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
13c10 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
13c20 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
13c30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
13c40 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
13c50 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
13c60 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
13c70 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
13c80 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
13c90 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
13ca0 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
13cb0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
13cc0 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
13cd0 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
13ce0 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
13cf0 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
13d00 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
13d10 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
13d20 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53  tic int whereInS
13d30 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
13d40 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
13d50 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
13d60 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
13d70 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
13d80 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
13d90 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  der,.  ExprList 
13da0 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54  *pList,     /* T
13db0 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e  he value list on
13dc0 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49   the RHS of "x I
13dd0 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29  N (v1,v2,v3,...)
13de0 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  " */.  tRowcnt *
13df0 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57  pnRow       /* W
13e00 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
13e10 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
13e20 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
13e30 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   *p = pBuilder->
13e40 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
13e50 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f 77  ndex;.  i64 nRow
13e60 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  0 = sqlite3LogEs
13e70 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c  tToInt(p->aiRowL
13e80 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e 74  ogEst[0]);.  int
13e90 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75   nRecValid = pBu
13ea0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
13eb0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
13ec0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53  ITE_OK;     /* S
13ed0 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
13ee0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
13ef0 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20 20  cnt nEst;       
13f00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13f10 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67   rows for a sing
13f20 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f  le term */.  tRo
13f30 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20 30  wcnt nRowEst = 0
13f40 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69  ;    /* New esti
13f50 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
13f60 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20  er of rows */.  
13f70 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
13f80 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
13f90 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  counter */..  as
13fa0 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
13fb0 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
13fc0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
13fd0 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  && i<pList->nExp
13fe0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73  r; i++){.    nEs
13ff0 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 72  t = nRow0;.    r
14000 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63  c = whereEqualSc
14010 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
14020 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61  uilder, pList->a
14030 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74  [i].pExpr, &nEst
14040 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b  );.    nRowEst +
14050 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75 69  = nEst;.    pBui
14060 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
14070 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d  = nRecValid;.  }
14080 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
14090 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
140a0 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77 30   nRowEst > nRow0
140b0 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52 6f   ) nRowEst = nRo
140c0 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d  w0;.    *pnRow =
140d0 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48   nRowEst;.    WH
140e0 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22  ERETRACE(0x10,("
140f0 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a  IN row estimate:
14100 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52 6f 77   est=%g\n", nRow
14110 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73  Est));.  }.  ass
14120 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e  ert( pBuilder->n
14130 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61  RecValid==nRecVa
14140 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  lid );.  return 
14150 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
14160 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
14170 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
14180 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61  ./*.** Disable a
14190 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
141a0 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65  RE clause.  Exce
141b0 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62  pt, do not disab
141c0 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69  le the term.** i
141d0 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20  f it controls a 
141e0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
141f0 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f  and it did not o
14200 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20  riginate in the 
14210 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63  ON.** or USING c
14220 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f  lause of that jo
14230 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64  in..**.** Consid
14240 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a  er the term t2.z
14250 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c  ='ok' in the fol
14260 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a  lowing queries:.
14270 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c  **.**   (1)  SEL
14280 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
14290 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
142a0 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32  .a=t2.x WHERE t2
142b0 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29  .z='ok'.**   (2)
142c0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
142d0 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
142e0 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  ON t1.a=t2.x AND
142f0 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
14300 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (3)  SELECT * FR
14310 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20  OM t1, t2 WHERE 
14320 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32  t1.a=t2.x AND t2
14330 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68  .z='ok'.**.** Th
14340 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64  e t2.z='ok' is d
14350 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69  isabled in the i
14360 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74  n (2) because it
14370 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69   originates.** i
14380 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e  n the ON clause.
14390 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69    The term is di
143a0 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65  sabled in (3) be
143b0 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20  cause it is not 
143c0 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46  part.** of a LEF
143d0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49  T OUTER JOIN.  I
143e0 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20  n (1), the term 
143f0 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e  is not disabled.
14400 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67  .**.** Disabling
14410 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74   a term causes t
14420 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20  hat term to not 
14430 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65  be tested in the
14440 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f   inner loop.** o
14450 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73  f the join.  Dis
14460 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74  abling is an opt
14470 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e  imization.  When
14480 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73   terms are satis
14490 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63  fied.** by indic
144a0 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74  es, we disable t
144b0 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72  hem to prevent r
144c0 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69  edundant tests i
144d0 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c  n the inner.** l
144e0 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67  oop.  We would g
144f0 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  et the correct r
14500 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e  esults if nothin
14510 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61  g were ever disa
14520 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69  bled,.** but joi
14530 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c  ns might run a l
14540 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54  ittle slower.  T
14550 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64  he trick is to d
14560 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a  isable as much.*
14570 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68  * as we can with
14580 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f  out disabling to
14590 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64  o much.  If we d
145a0 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20  isabled in (1), 
145b0 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20  we'd get.** the 
145c0 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53  wrong answer.  S
145d0 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a  ee ticket #813..
145e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
145f0 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65  isableTerm(Where
14600 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57  Level *pLevel, W
14610 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29  hereTerm *pTerm)
14620 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20  {.  if( pTerm.  
14630 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77      && (pTerm->w
14640 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
14650 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26  DED)==0.      &&
14660 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a   (pLevel->iLeftJ
14670 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61  oin==0 || ExprHa
14680 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
14690 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
146a0 6f 69 6e 29 29 0a 20 20 20 20 20 20 26 26 20 28  oin)).      && (
146b0 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
146c0 20 26 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   & pTerm->prereq
146d0 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  All)==0.  ){.   
146e0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
146f0 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
14700 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50     if( pTerm->iP
14710 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20  arent>=0 ){.    
14720 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74    WhereTerm *pOt
14730 68 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57  her = &pTerm->pW
14740 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72  C->a[pTerm->iPar
14750 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ent];.      if( 
14760 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c  (--pOther->nChil
14770 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d)==0 ){.       
14780 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
14790 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20  vel, pOther);.  
147a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
147b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
147c0 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63   OP_Affinity opc
147d0 6f 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65  ode to apply the
147e0 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
147f0 20 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20   string zAff.** 
14800 74 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74 65  to the n registe
14810 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  rs starting at b
14820 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61  ase. .**.** As a
14830 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  n optimization, 
14840 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
14850 65 6e 74 72 69 65 73 20 28 77 68 69 63 68 20 61  entries (which a
14860 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68  re no-ops) at th
14870 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61  e.** beginning a
14880 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66 66 20 61  nd end of zAff a
14890 72 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20  re ignored.  If 
148a0 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 7a  all entries in z
148b0 41 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54  Aff are.** SQLIT
148c0 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e  E_AFF_NONE, then
148d0 20 6e 6f 20 63 6f 64 65 20 67 65 74 73 20 67 65   no code gets ge
148e0 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  nerated..**.** T
148f0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
14900 73 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  s its own copy o
14910 66 20 7a 41 66 66 20 73 6f 20 74 68 61 74 20 74  f zAff so that t
14920 68 65 20 63 61 6c 6c 65 72 20 69 73 20 66 72 65  he caller is fre
14930 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a  e.** to modify z
14940 41 66 66 20 61 66 74 65 72 20 74 68 69 73 20 72  Aff after this r
14950 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a  outine returns..
14960 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
14970 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
14980 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14990 69 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c  int base, int n,
149a0 20 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20   char *zAff){.  
149b0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
149c0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 7a  ->pVdbe;.  if( z
149d0 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Aff==0 ){.    as
149e0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
149f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
14a00 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
14a10 7d 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  }.  assert( v!=0
14a20 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74   );..  /* Adjust
14a30 20 62 61 73 65 20 61 6e 64 20 6e 20 74 6f 20 73   base and n to s
14a40 6b 69 70 20 6f 76 65 72 20 53 51 4c 49 54 45 5f  kip over SQLITE_
14a50 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73  AFF_NONE entries
14a60 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
14a70 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f  g.  ** and end o
14a80 66 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  f the affinity s
14a90 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68  tring..  */.  wh
14aa0 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41 66 66  ile( n>0 && zAff
14ab0 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  [0]==SQLITE_AFF_
14ac0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b  NONE ){.    n--;
14ad0 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20  .    base++;.   
14ae0 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77   zAff++;.  }.  w
14af0 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41 66  hile( n>1 && zAf
14b00 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41  f[n-1]==SQLITE_A
14b10 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e  FF_NONE ){.    n
14b20 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  --;.  }..  /* Co
14b30 64 65 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  de the OP_Affini
14b40 74 79 20 6f 70 63 6f 64 65 20 69 66 20 74 68 65  ty opcode if the
14b50 72 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6c  re is anything l
14b60 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20  eft to do. */.  
14b70 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73  if( n>0 ){.    s
14b80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14b90 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
14ba0 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73   base, n);.    s
14bb0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
14bc0 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20  P4(v, -1, zAff, 
14bd0 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  n);.    sqlite3E
14be0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
14bf0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62  Change(pParse, b
14c00 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a  ase, n);.  }.}..
14c10 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
14c20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
14c30 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
14c40 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
14c50 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74  use.  An equalit
14c60 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65  y.** term can be
14c70 20 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f   either X=expr o
14c80 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20  r X IN (...).   
14c90 70 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72  pTerm is the ter
14ca0 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65  m to be .** code
14cb0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72  d..**.** The cur
14cc0 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rent value for t
14cd0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
14ce0 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65   left in registe
14cf0 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f  r iReg..**.** Fo
14d00 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  r a constraint o
14d10 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70  f the form X=exp
14d20 72 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  r, the expressio
14d30 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61  n is evaluated a
14d40 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74  nd its.** result
14d50 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20   is left on the 
14d60 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73  stack.  For cons
14d70 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66  traints of the f
14d80 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a  orm X IN (...).*
14d90 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * this routine s
14da0 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68  ets up a loop th
14db0 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20  at will iterate 
14dc0 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20  over all values 
14dd0 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of X..*/.static 
14de0 69 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79  int codeEquality
14df0 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
14e00 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54  Parse,      /* T
14e10 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
14e20 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
14e30 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54  m *pTerm,   /* T
14e40 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  he term of the W
14e50 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
14e60 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  e coded */.  Whe
14e70 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
14e80 20 2f 2a 20 54 68 65 20 6c 65 76 65 6c 20 6f 66   /* The level of
14e90 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
14ea0 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
14eb0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 45 71 2c  on */.  int iEq,
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14ed0 6e 64 65 78 20 6f 66 20 74 68 65 20 65 71 75 61  ndex of the equa
14ee0 6c 69 74 79 20 74 65 72 6d 20 77 69 74 68 69 6e  lity term within
14ef0 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20   this level */. 
14f00 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20   int bRev,      
14f10 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
14f20 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 49   reverse-order I
14f30 4e 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a  N operations */.
14f40 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 20 20    int iTarget   
14f50 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74        /* Attempt
14f60 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74   to leave result
14f70 73 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  s in this regist
14f80 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  er */.){.  Expr 
14f90 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
14fa0 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  pr;.  Vdbe *v = 
14fb0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
14fc0 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20   int iReg;      
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14fe0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
14ff0 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73  results */..  as
15000 73 65 72 74 28 20 69 54 61 72 67 65 74 3e 30 20  sert( iTarget>0 
15010 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d  );.  if( pX->op=
15020 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52  =TK_EQ ){.    iR
15030 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
15040 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
15050 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69  e, pX->pRight, i
15060 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  Target);.  }else
15070 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
15080 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52  ISNULL ){.    iR
15090 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20  eg = iTarget;.  
150a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
150b0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
150c0 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65  0, iReg);.#ifnde
150d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
150e0 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a  BQUERY.  }else{.
150f0 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20      int eType;. 
15100 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20     int iTab;.   
15110 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
15120 70 49 6e 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f  pIn;.    WhereLo
15130 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  op *pLoop = pLev
15140 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20  el->pWLoop;..   
15150 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
15160 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
15170 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 0a 20 20  TUALTABLE)==0.  
15180 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e      && pLoop->u.
15190 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 0a  btree.pIndex!=0.
151a0 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e        && pLoop->
151b0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
151c0 61 53 6f 72 74 4f 72 64 65 72 5b 69 45 71 5d 0a  aSortOrder[iEq].
151d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73      ){.      tes
151e0 74 63 61 73 65 28 20 69 45 71 3d 3d 30 20 29 3b  tcase( iEq==0 );
151f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15200 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62   bRev );.      b
15210 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20  Rev = !bRev;.   
15220 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
15230 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
15240 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
15250 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20  et;.    eType = 
15260 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
15270 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20 30  ex(pParse, pX, 0
15280 29 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  );.    if( eType
15290 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ==IN_INDEX_INDEX
152a0 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 74  _DESC ){.      t
152b0 65 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b  estcase( bRev );
152c0 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62  .      bRev = !b
152d0 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Rev;.    }.    i
152e0 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  Tab = pX->iTable
152f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15300 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20  eAddOp2(v, bRev 
15310 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52  ? OP_Last : OP_R
15320 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
15330 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
15340 65 49 66 28 76 2c 20 62 52 65 76 29 3b 0a 20 20  eIf(v, bRev);.  
15350 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
15360 28 76 2c 20 21 62 52 65 76 29 3b 0a 20 20 20 20  (v, !bRev);.    
15370 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
15380 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
15390 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a  MULTI_OR)==0 );.
153a0 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
153b0 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 4e 5f 41  gs |= WHERE_IN_A
153c0 42 4c 45 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  BLE;.    if( pLe
153d0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30  vel->u.in.nIn==0
153e0 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
153f0 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
15400 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
15410 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  (v);.    }.    p
15420 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b  Level->u.in.nIn+
15430 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75  +;.    pLevel->u
15440 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20  .in.aInLoop =.  
15450 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
15460 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72  allocOrFree(pPar
15470 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  se->db, pLevel->
15480 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20  u.in.aInLoop,.  
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
154b0 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  of(pLevel->u.in.
154c0 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76  aInLoop[0])*pLev
154d0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20  el->u.in.nIn);. 
154e0 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d     pIn = pLevel-
154f0 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20  >u.in.aInLoop;. 
15500 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20     if( pIn ){.  
15510 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65      pIn += pLeve
15520 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b  l->u.in.nIn - 1;
15530 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72  .      pIn->iCur
15540 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69   = iTab;.      i
15550 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
15560 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
15570 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54      pIn->addrInT
15580 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
15590 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
155a0 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b  id, iTab, iReg);
155b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
155c0 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
155d0 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
155e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
155f0 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20  olumn, iTab, 0, 
15600 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iReg);.      }. 
15610 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f       pIn->eEndLo
15620 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  opOp = bRev ? OP
15630 5f 50 72 65 76 49 66 4f 70 65 6e 20 3a 20 4f 50  _PrevIfOpen : OP
15640 5f 4e 65 78 74 49 66 4f 70 65 6e 3b 0a 20 20 20  _NextIfOpen;.   
15650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15660 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
15670 6c 2c 20 69 52 65 67 29 3b 20 56 64 62 65 43 6f  l, iReg); VdbeCo
15680 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
15690 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
156a0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30  el->u.in.nIn = 0
156b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
156c0 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d   }.  disableTerm
156d0 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
156e0 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
156f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
15700 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
15710 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d   evaluate all ==
15720 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
15730 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e  nts for an.** in
15740 64 65 78 20 73 63 61 6e 2e 0a 2a 2a 0a 2a 2a 20  dex scan..**.** 
15750 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e  For example, con
15760 73 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61  sider table t1(a
15770 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68  ,b,c,d,e,f) with
15780 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29   index i1(a,b,c)
15790 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  ..** Suppose the
157a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
157b0 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44   this:  a==5 AND
157c0 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e   b IN (1,2,3) AN
157d0 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a  D c>5 AND c<10.*
157e0 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20  * The index has 
157f0 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65  as many as three
15800 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
15810 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68  aints, but in th
15820 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74  is.** example, t
15830 68 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c  he third "c" val
15840 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c  ue is an inequal
15850 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77  ity.  So only tw
15860 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74  o .** constraint
15870 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68  s are coded.  Th
15880 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
15890 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
158a0 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d   evaluate.** a==
158b0 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c  5 and b IN (1,2,
158c0 33 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74  3).  The current
158d0 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e   values for a an
158e0 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  d b will be stor
158f0 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75  ed.** in consecu
15900 74 69 76 65 20 72 65 67 69 73 74 65 72 73 20 61  tive registers a
15910 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  nd the index of 
15920 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
15930 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  er is returned..
15940 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
15950 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d  mple above nEq==
15960 32 2e 20 20 42 75 74 20 74 68 69 73 20 73 75 62  2.  But this sub
15970 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f  routine works fo
15980 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f  r any value.** o
15990 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20  f nEq including 
159a0 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74  0.  If nEq==0, t
159b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
159c0 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  early a no-op..*
159d0 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  * The only thing
159e0 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f   it does is allo
159f0 63 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d  cate the pLevel-
15a00 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c  >iMem memory cel
15a10 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65  l and.** compute
15a20 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
15a30 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ring..**.** The 
15a40 6e 45 78 74 72 61 52 65 67 20 70 61 72 61 6d 65  nExtraReg parame
15a50 74 65 72 20 69 73 20 30 20 6f 72 20 31 2e 20 20  ter is 0 or 1.  
15a60 49 74 20 69 73 20 30 20 69 66 20 61 6c 6c 20 57  It is 0 if all W
15a70 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
15a80 74 72 61 69 6e 74 73 0a 2a 2a 20 61 72 65 20 3d  traints.** are =
15a90 3d 20 6f 72 20 49 4e 20 61 6e 64 20 61 72 65 20  = or IN and are 
15aa0 63 6f 76 65 72 65 64 20 62 79 20 74 68 65 20 6e  covered by the n
15ab0 45 71 2e 20 20 6e 45 78 74 72 61 52 65 67 20 69  Eq.  nExtraReg i
15ac0 73 20 31 20 69 66 20 74 68 65 72 65 20 69 73 0a  s 1 if there is.
15ad0 2a 2a 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  ** an inequality
15ae0 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 73 75 63   constraint (suc
15af0 68 20 61 73 20 74 68 65 20 22 63 3e 3d 35 20 41  h as the "c>=5 A
15b00 4e 44 20 63 3c 31 30 22 20 69 6e 20 74 68 65 20  ND c<10" in the 
15b10 65 78 61 6d 70 6c 65 29 20 74 68 61 74 0a 2a 2a  example) that.**
15b20 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 74 68   occurs after th
15b30 65 20 6e 45 71 20 71 75 61 6c 69 74 79 20 63 6f  e nEq quality co
15b40 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a  nstraints..**.**
15b50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
15b60 6c 6f 63 61 74 65 73 20 61 20 72 61 6e 67 65 20  locates a range 
15b70 6f 66 20 6e 45 71 2b 6e 45 78 74 72 61 52 65 67  of nEq+nExtraReg
15b80 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
15b90 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  d returns.** the
15ba0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69   index of the fi
15bb0 72 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  rst memory cell 
15bc0 69 6e 20 74 68 61 74 20 72 61 6e 67 65 2e 20 54  in that range. T
15bd0 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  he code that.** 
15be0 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
15bf0 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74  ne will use that
15c00 20 6d 65 6d 6f 72 79 20 72 61 6e 67 65 20 74 6f   memory range to
15c10 20 73 74 6f 72 65 20 6b 65 79 73 20 66 6f 72 0a   store keys for.
15c20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 74 65 72  ** start and ter
15c30 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69  mination conditi
15c40 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
15c50 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66  .** key value of
15c60 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f   the loop.  If o
15c70 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70  ne or more IN op
15c80 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20  erators appear, 
15c90 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
15ca0 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61  tine allocates a
15cb0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71  n additional nEq
15cc0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
15cd0 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73  r internal.** us
15ce0 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  e..**.** Before 
15cf0 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66  returning, *pzAf
15d00 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  f is set to poin
15d10 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
15d20 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f  ntaining a.** co
15d30 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
15d40 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
15d50 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c   of the index al
15d60 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a  located using.**
15d70 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
15d80 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72  (). Except, entr
15d90 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20  ies in the copy 
15da0 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 61 73  of the string as
15db0 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
15dc0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
15dd0 61 69 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e  aints that use N
15de0 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72 65  ONE affinity are
15df0 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54   set to.** SQLIT
15e00 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73  E_AFF_NONE. This
15e10 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68   is to deal with
15e20 20 53 51 4c 20 73 75 63 68 20 61 73 20 74 68 65   SQL such as the
15e30 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
15e40 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
15e50 20 74 31 28 61 20 54 45 58 54 20 50 52 49 4d 41   t1(a TEXT PRIMA
15e60 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20  RY KEY, b);.**  
15e70 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
15e80 20 74 31 20 41 53 20 74 32 2c 20 74 31 20 57 48   t1 AS t2, t1 WH
15e90 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b  ERE t1.a = t2.b;
15ea0 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78  .**.** In the ex
15eb0 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65  ample above, the
15ec0 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20   index on t1(a) 
15ed0 68 61 73 20 54 45 58 54 20 61 66 66 69 6e 69 74  has TEXT affinit
15ee0 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20  y. But since.** 
15ef0 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 73  the right hand s
15f00 69 64 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c  ide of the equal
15f10 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  ity constraint (
15f20 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61  t2.b) has NONE a
15f30 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63  ffinity,.** no c
15f40 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64  onversion should
15f50 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65   be attempted be
15f60 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e  fore using a t2.
15f70 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20  b value as part 
15f80 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73  of.** a key to s
15f90 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e  earch the index.
15fa0 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74   Hence the first
15fb0 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74   byte in the ret
15fc0 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a  urned affinity.*
15fd0 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73  * string in this
15fe0 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62   example would b
15ff0 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  e set to SQLITE_
16000 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61  AFF_NONE..*/.sta
16010 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45  tic int codeAllE
16020 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
16030 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
16040 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
16050 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
16060 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
16070 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73  ,   /* Which nes
16080 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
16090 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69  FROM we are codi
160a0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  ng */.  int bRev
160b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
160c0 20 52 65 76 65 72 73 65 20 74 68 65 20 6f 72 64   Reverse the ord
160d0 65 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  er of IN operato
160e0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  rs */.  int nExt
160f0 72 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a  raReg,        /*
16100 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
16110 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
16120 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72  locate */.  char
16130 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20   **pzAff        
16140 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f    /* OUT: Set to
16150 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69   point to affini
16160 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
16170 20 20 75 31 36 20 6e 45 71 3b 20 20 20 20 20 20    u16 nEq;      
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16190 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
161a0 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
161b0 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f  aints to code */
161c0 0a 20 20 75 31 36 20 6e 53 6b 69 70 3b 20 20 20  .  u16 nSkip;   
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
161f0 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20  ft-most columns 
16200 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 56 64 62  to skip */.  Vdb
16210 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
16220 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
16230 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e vm under const
16240 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  ruction */.  Ind
16250 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
16260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16270 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73  e index being us
16280 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70  ed for this loop
16290 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
162a0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
162b0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
162c0 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20  constraint term 
162d0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
162e0 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
162f0 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
16300 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
16310 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16330 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
16340 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
16350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16360 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
16370 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b  r */.  int nReg;
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
163a0 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  f registers to a
163b0 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
163c0 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20  r *zAff;        
163d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
163e0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f  finity string to
163f0 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a   return */..  /*
16400 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20   This module is 
16410 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71  only called on q
16420 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20  uery plans that 
16430 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f  use an index. */
16440 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
16450 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73 73  l->pWLoop;.  ass
16460 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
16470 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
16480 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
16490 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  .  nEq = pLoop->
164a0 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 6e  u.btree.nEq;.  n
164b0 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  Skip = pLoop->u.
164c0 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 70  btree.nSkip;.  p
164d0 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
164e0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61  tree.pIndex;.  a
164f0 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
16500 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
16510 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f  ut how many memo
16520 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c  ry cells we will
16530 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63   need then alloc
16540 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20  ate them..  */. 
16550 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
16560 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e  e->nMem + 1;.  n
16570 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Reg = pLoop->u.b
16580 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72  tree.nEq + nExtr
16590 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  aReg;.  pParse->
165a0 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20  nMem += nReg;.. 
165b0 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44   zAff = sqlite3D
165c0 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
165d0 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78  db, sqlite3Index
165e0 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70  AffinityStr(v, p
165f0 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41  Idx));.  if( !zA
16600 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  ff ){.    pParse
16610 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
16620 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69  ed = 1;.  }..  i
16630 66 28 20 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  f( nSkip ){.    
16640 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c  int iIdxCur = pL
16650 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
16660 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16670 64 4f 70 31 28 76 2c 20 28 62 52 65 76 3f 4f 50  dOp1(v, (bRev?OP
16680 5f 4c 61 73 74 3a 4f 50 5f 52 65 77 69 6e 64 29  _Last:OP_Rewind)
16690 2c 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  , iIdxCur);.    
166a0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
166b0 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20  , bRev==0);.    
166c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
166d0 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20  , bRev!=0);.    
166e0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
166f0 22 62 65 67 69 6e 20 73 6b 69 70 2d 73 63 61 6e  "begin skip-scan
16700 20 6f 6e 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a   on %s", pIdx->z
16710 4e 61 6d 65 29 29 3b 0a 20 20 20 20 6a 20 3d 20  Name));.    j = 
16720 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16730 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
16740 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53     pLevel->addrS
16750 6b 69 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  kip = sqlite3Vdb
16760 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 28 62  eAddOp4Int(v, (b
16770 52 65 76 3f 4f 50 5f 53 65 65 6b 4c 54 3a 4f 50  Rev?OP_SeekLT:OP
16780 5f 53 65 65 6b 47 54 29 2c 0a 20 20 20 20 20 20  _SeekGT),.      
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167a0 20 20 20 20 20 20 69 49 64 78 43 75 72 2c 20 30        iIdxCur, 0
167b0 2c 20 72 65 67 42 61 73 65 2c 20 6e 53 6b 69 70  , regBase, nSkip
167c0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
167d0 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30  ageIf(v, bRev==0
167e0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
167f0 61 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30  ageIf(v, bRev!=0
16800 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16810 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 29  beJumpHere(v, j)
16820 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
16830 3c 6e 53 6b 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20  <nSkip; j++){.  
16840 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16850 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
16860 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6a 2c 20  mn, iIdxCur, j, 
16870 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
16880 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
16890 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29  aiColumn[j]>=0 )
168a0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
168b0 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
168c0 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
168d0 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  [pIdx->aiColumn[
168e0 6a 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  j]].zName));.   
168f0 20 7d 0a 20 20 7d 20 20 20 20 0a 0a 20 20 2f 2a   }.  }    ..  /*
16900 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71   Evaluate the eq
16910 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
16920 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ts.  */.  assert
16930 28 20 7a 41 66 66 3d 3d 30 20 7c 7c 20 28 69 6e  ( zAff==0 || (in
16940 74 29 73 74 72 6c 65 6e 28 7a 41 66 66 29 3e 3d  t)strlen(zAff)>=
16950 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 6e  nEq );.  for(j=n
16960 53 6b 69 70 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b  Skip; j<nEq; j++
16970 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  ){.    int r1;. 
16980 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70     pTerm = pLoop
16990 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
169a0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
169b0 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 );.    /* The 
169c0 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 63 61  following testca
169d0 73 65 20 69 73 20 74 72 75 65 20 66 6f 72 20 69  se is true for i
169e0 6e 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75  ndices with redu
169f0 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a  ndant columns. .
16a00 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54      ** Ex: CREAT
16a10 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
16a20 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20  (a,b,a); SELECT 
16a30 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
16a40 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a  a=0 AND b=0; */.
16a50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
16a60 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
16a70 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29  TERM_CODED)!=0 )
16a80 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
16a90 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
16aa0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
16ab0 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71  .    r1 = codeEq
16ac0 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
16ad0 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
16ae0 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65 67 42 61  , j, bRev, regBa
16af0 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72  se+j);.    if( r
16b00 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a  1!=regBase+j ){.
16b10 20 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d        if( nReg==
16b20 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
16b30 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
16b40 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  eg(pParse, regBa
16b50 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67  se);.        reg
16b60 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20  Base = r1;.     
16b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16b80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16b90 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
16ba0 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  1, regBase+j);. 
16bb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16bc0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
16bd0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
16be0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
16bf0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
16c00 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
16c10 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  N );.    if( (pT
16c20 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
16c30 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49   (WO_ISNULL|WO_I
16c40 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  N))==0 ){.      
16c50 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
16c60 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
16c70 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ght;.      if( s
16c80 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
16c90 75 6c 6c 28 70 52 69 67 68 74 29 20 29 7b 0a 20  ull(pRight) ){. 
16ca0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16cb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
16cc0 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6a  sNull, regBase+j
16cd0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
16ce0 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  k);.        Vdbe
16cf0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
16d00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
16d10 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
16d20 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
16d30 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
16d40 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49  , zAff[j])==SQLI
16d50 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
16d60 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d           zAff[j]
16d70 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
16d80 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
16d90 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
16da0 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
16db0 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68  nityChange(pRigh
16dc0 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20  t, zAff[j]) ){. 
16dd0 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d           zAff[j]
16de0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
16df0 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
16e00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16e10 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b    *pzAff = zAff;
16e20 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73  .  return regBas
16e30 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  e;.}..#ifndef SQ
16e40 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
16e50 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  N./*.** This rou
16e60 74 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72  tine is a helper
16e70 20 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65   for explainInde
16e80 78 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a  xRange() below.*
16e90 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20  *.** pStr holds 
16ea0 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65  the text of an e
16eb0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77  xpression that w
16ec0 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75  e are building u
16ed0 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74  p one term.** at
16ee0 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72   a time.  This r
16ef0 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65  outine adds a ne
16f00 77 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e  w term to the en
16f10 64 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  d of the express
16f20 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72  ion..** Terms ar
16f30 65 20 73 65 70 61 72 61 74 65 64 20 62 79 20 41  e separated by A
16f40 4e 44 20 73 6f 20 61 64 64 20 74 68 65 20 22 41  ND so add the "A
16f50 4e 44 22 20 74 65 78 74 20 66 6f 72 20 73 65 63  ND" text for sec
16f60 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ond and subseque
16f70 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  nt.** terms only
16f80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
16f90 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
16fa0 72 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a  rm(.  StrAccum *
16fb0 70 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  pStr,           
16fc0 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78    /* The text ex
16fd0 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62  pression being b
16fe0 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  uilt */.  int iT
16ff0 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
17000 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
17010 66 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69  f this term.  Fi
17020 72 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20  rst is zero */. 
17030 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
17040 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  lumn,        /* 
17050 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
17060 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  mn */.  const ch
17070 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20  ar *zOp         
17080 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
17090 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29  he operator */.)
170a0 7b 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29 20  {.  if( iTerm ) 
170b0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
170c0 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e  ppend(pStr, " AN
170d0 44 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74  D ", 5);.  sqlit
170e0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
170f0 41 6c 6c 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d  All(pStr, zColum
17100 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  n);.  sqlite3Str
17110 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
17120 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c  , zOp, 1);.  sql
17130 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
17140 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29  nd(pStr, "?", 1)
17150 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
17160 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72  ent pLevel descr
17170 69 62 65 73 20 61 20 73 74 72 61 74 65 67 79 20  ibes a strategy 
17180 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62  for scanning tab
17190 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a  le pTab. This .*
171a0 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
171b0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
171c0 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
171d0 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73  containing a des
171e0 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  cription.** of t
171f0 68 65 20 73 75 62 73 65 74 20 6f 66 20 74 61 62  he subset of tab
17200 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20  le rows scanned 
17210 62 79 20 74 68 65 20 73 74 72 61 74 65 67 79 20  by the strategy 
17220 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61  in the form of a
17230 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73  n.** SQL express
17240 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20  ion. Or, if all 
17250 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64  rows are scanned
17260 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
17270 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ed..**.** For ex
17280 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75  ample, if the qu
17290 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ery:.**.**   SEL
172a0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
172b0 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b  ERE a=1 AND b>2;
172c0 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e  .**.** is run an
172d0 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  d there is an in
172e0 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74  dex on (a, b), t
172f0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
17300 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73  n returns a.** s
17310 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f  tring similar to
17320 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41  :.**.**   "a=? A
17330 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68  ND b>?".**.** Th
17340 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  e returned point
17350 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d  er points to mem
17360 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
17370 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  m sqlite3DbMallo
17380 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68  c()..** It is th
17390 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
173a0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
173b0 6f 20 66 72 65 65 20 74 68 65 20 62 75 66 66 65  o free the buffe
173c0 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  r when it is.** 
173d0 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
173e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
173f0 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78  ar *explainIndex
17400 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64  Range(sqlite3 *d
17410 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  b, WhereLoop *pL
17420 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  oop, Table *pTab
17430 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
17440 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
17450 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 75 31  ree.pIndex;.  u1
17460 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  6 nEq = pLoop->u
17470 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 75 31  .btree.nEq;.  u1
17480 36 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d  6 nSkip = pLoop-
17490 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a  >u.btree.nSkip;.
174a0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f    int i, j;.  Co
174b0 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61  lumn *aCol = pTa
174c0 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 31 36 20 2a  b->aCol;.  i16 *
174d0 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65  aiColumn = pInde
174e0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53  x->aiColumn;.  S
174f0 74 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20 20  trAccum txt;..  
17500 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 28 70  if( nEq==0 && (p
17510 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
17520 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
17530 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
17540 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))==0 ){.    ret
17550 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
17560 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
17570 28 26 74 78 74 2c 20 30 2c 20 30 2c 20 53 51 4c  (&txt, 0, 0, SQL
17580 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b  ITE_MAX_LENGTH);
17590 0a 20 20 74 78 74 2e 64 62 20 3d 20 64 62 3b 0a  .  txt.db = db;.
175a0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
175b0 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20  mAppend(&txt, " 
175c0 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d  (", 2);.  for(i=
175d0 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a  0; i<nEq; i++){.
175e0 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 69      char *z = (i
175f0 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  ==pIndex->nKeyCo
17600 6c 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  l ) ? "rowid" : 
17610 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d  aCol[aiColumn[i]
17620 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
17630 20 69 3e 3d 6e 53 6b 69 70 20 29 7b 0a 20 20 20   i>=nSkip ){.   
17640 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
17650 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c  Term(&txt, i, z,
17660 20 22 3d 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65   "=");.    }else
17670 7b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29 20  {.      if( i ) 
17680 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
17690 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20 41 4e  ppend(&txt, " AN
176a0 44 20 22 2c 20 35 29 3b 0a 20 20 20 20 20 20 73  D ", 5);.      s
176b0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
176c0 70 65 6e 64 28 26 74 78 74 2c 20 22 41 4e 59 28  pend(&txt, "ANY(
176d0 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 4);.      sql
176e0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
176f0 6e 64 41 6c 6c 28 26 74 78 74 2c 20 7a 29 3b 0a  ndAll(&txt, z);.
17700 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
17710 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74  AccumAppend(&txt
17720 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 7d  , ")", 1);.    }
17730 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20  .  }..  j = i;. 
17740 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
17750 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ags&WHERE_BTM_LI
17760 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20  MIT ){.    char 
17770 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d  *z = (j==pIndex-
17780 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f  >nKeyCol ) ? "ro
17790 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f  wid" : aCol[aiCo
177a0 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
177b0 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
177c0 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c  dTerm(&txt, i++,
177d0 20 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20   z, ">");.  }.  
177e0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
177f0 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  gs&WHERE_TOP_LIM
17800 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  IT ){.    char *
17810 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e  z = (j==pIndex->
17820 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f 77  nKeyCol ) ? "row
17830 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c  id" : aCol[aiCol
17840 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[j]].zName;. 
17850 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
17860 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c  Term(&txt, i, z,
17870 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c   "<");.  }.  sql
17880 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
17890 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29  nd(&txt, ")", 1)
178a0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
178b0 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
178c0 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (&txt);.}../*.**
178d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
178e0 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
178f0 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65   currently proce
17900 73 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e  ssing an EXPLAIN
17910 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63   QUERY PLAN.** c
17920 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 71  ommand. If the q
17930 75 65 72 79 20 62 65 69 6e 67 20 63 6f 6d 70 69  uery being compi
17940 6c 65 64 20 69 73 20 61 6e 20 45 58 50 4c 41 49  led is an EXPLAI
17950 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c 20 61 20  N QUERY PLAN, a 
17960 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64  single.** record
17970 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
17980 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72   output to descr
17990 69 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63  ibe the table sc
179a0 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 0a  an strategy in .
179b0 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ** pLevel..*/.st
179c0 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
179d0 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73  nOneScan(.  Pars
179e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
179f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
17a00 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
17a10 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
17a20 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
17a30 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20    /* Table list 
17a40 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73  this loop refers
17a50 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65   to */.  WhereLe
17a60 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20  vel *pLevel,    
17a70 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e           /* Scan
17a80 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70   to write OP_Exp
17a90 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20  lain opcode for 
17aa0 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
17ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ac0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
17ad0 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e  r "level" column
17ae0 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
17af0 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b10 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72  /* Value for "fr
17b20 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75  om" column of ou
17b30 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63  tput */.  u16 wc
17b40 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
17b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
17b60 67 73 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  gs passed to sql
17b70 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
17b80 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
17b90 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
17ba0 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
17bb0 6e 3d 3d 32 20 29 0a 23 65 6e 64 69 66 0a 20 20  n==2 ).#endif.  
17bc0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
17bd0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
17be0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
17bf0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
17c00 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
17c10 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
17c20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f    /* VM being co
17c30 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20  nstructed */.   
17c40 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
17c50 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f  Parse->db;     /
17c60 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
17c70 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
17c80 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Msg;            
17c90 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74         /* Text t
17ca0 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74  o add to EQP out
17cb0 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  put */.    int i
17cc0 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
17cd0 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65  lectId;  /* Sele
17ce0 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74  ct id (left-most
17cf0 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20   output column) 
17d00 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61  */.    int isSea
17d10 72 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  rch;            
17d20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
17d30 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65   a SEARCH. False
17d40 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20   for SCAN. */.  
17d50 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
17d60 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
17d70 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69  /* The controlli
17d80 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ng WhereLoop obj
17d90 65 63 74 20 2a 2f 0a 20 20 20 20 75 33 32 20 66  ect */.    u32 f
17da0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
17db0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
17dc0 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
17dd0 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20  this loop */..  
17de0 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
17df0 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c  ->pWLoop;.    fl
17e00 61 67 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46  ags = pLoop->wsF
17e10 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 28 66  lags;.    if( (f
17e20 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49  lags&WHERE_MULTI
17e30 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c  _OR) || (wctrlFl
17e40 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42  ags&WHERE_ONETAB
17e50 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75 72  LE_ONLY) ) retur
17e60 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68  n;..    isSearch
17e70 20 3d 20 28 66 6c 61 67 73 26 28 57 48 45 52 45   = (flags&(WHERE
17e80 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
17e90 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a  _TOP_LIMIT))!=0.
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
17eb0 28 66 6c 61 67 73 26 57 48 45 52 45 5f 56 49 52  (flags&WHERE_VIR
17ec0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26  TUALTABLE)==0 &&
17ed0 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65   (pLoop->u.btree
17ee0 2e 6e 45 71 3e 30 29 29 0a 20 20 20 20 20 20 20  .nEq>0)).       
17ef0 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c       || (wctrlFl
17f00 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52  ags&(WHERE_ORDER
17f10 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44  BY_MIN|WHERE_ORD
17f20 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20  ERBY_MAX));..   
17f30 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
17f40 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
17f50 20 69 73 53 65 61 72 63 68 3f 22 53 45 41 52 43   isSearch?"SEARC
17f60 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20 20  H":"SCAN");.    
17f70 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
17f80 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  ct ){.      zMsg
17f90 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
17fa0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
17fb0 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20 7a   SUBQUERY %d", z
17fc0 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65  Msg,pItem->iSele
17fd0 63 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ctId);.    }else
17fe0 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
17ff0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
18000 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 54 41 42  b, zMsg, "%s TAB
18010 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  LE %s", zMsg, pI
18020 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
18030 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65   }..    if( pIte
18040 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
18050 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
18060 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
18070 73 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20  sg, "%s AS %s", 
18080 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  zMsg, pItem->zAl
18090 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ias);.    }.    
180a0 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 57 48  if( (flags & (WH
180b0 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49  ERE_IPK|WHERE_VI
180c0 52 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30 0a  RTUALTABLE))==0.
180d0 20 20 20 20 20 26 26 20 41 4c 57 41 59 53 28 70       && ALWAYS(p
180e0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
180f0 6e 64 65 78 21 3d 30 29 0a 20 20 20 20 29 7b 0a  ndex!=0).    ){.
18100 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
18110 20 2a 7a 46 6d 74 3b 0a 20 20 20 20 20 20 49 6e   *zFmt;.      In
18120 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 6f 6f  dex *pIdx = pLoo
18130 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
18140 78 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  x;.      char *z
18150 57 68 65 72 65 20 3d 20 65 78 70 6c 61 69 6e 49  Where = explainI
18160 6e 64 65 78 52 61 6e 67 65 28 64 62 2c 20 70 4c  ndexRange(db, pL
18170 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  oop, pItem->pTab
18180 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
18190 20 21 28 66 6c 61 67 73 26 57 48 45 52 45 5f 41   !(flags&WHERE_A
181a0 55 54 4f 5f 49 4e 44 45 58 29 20 7c 7c 20 28 66  UTO_INDEX) || (f
181b0 6c 61 67 73 26 57 48 45 52 45 5f 49 44 58 5f 4f  lags&WHERE_IDX_O
181c0 4e 4c 59 29 20 29 3b 0a 20 20 20 20 20 20 69 66  NLY) );.      if
181d0 28 20 21 48 61 73 52 6f 77 69 64 28 70 49 74 65  ( !HasRowid(pIte
181e0 6d 2d 3e 70 54 61 62 29 20 26 26 20 49 73 50 72  m->pTab) && IsPr
181f0 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
18200 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  dx) ){.        z
18210 46 6d 74 20 3d 20 7a 57 68 65 72 65 20 3f 20 22  Fmt = zWhere ? "
18220 25 73 20 55 53 49 4e 47 20 50 52 49 4d 41 52 59  %s USING PRIMARY
18230 20 4b 45 59 25 2e 30 73 25 73 22 20 3a 20 22 25   KEY%.0s%s" : "%
18240 73 25 2e 30 73 25 73 22 3b 0a 20 20 20 20 20 20  s%.0s%s";.      
18250 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
18260 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
18270 45 58 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46  EX ){.        zF
18280 6d 74 20 3d 20 22 25 73 20 55 53 49 4e 47 20 41  mt = "%s USING A
18290 55 54 4f 4d 41 54 49 43 20 43 4f 56 45 52 49 4e  UTOMATIC COVERIN
182a0 47 20 49 4e 44 45 58 25 2e 30 73 25 73 22 3b 0a  G INDEX%.0s%s";.
182b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
182c0 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
182d0 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  X_ONLY ){.      
182e0 20 20 7a 46 6d 74 20 3d 20 22 25 73 20 55 53 49    zFmt = "%s USI
182f0 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
18300 58 20 25 73 25 73 22 3b 0a 20 20 20 20 20 20 7d  X %s%s";.      }
18310 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 46  else{.        zF
18320 6d 74 20 3d 20 22 25 73 20 55 53 49 4e 47 20 49  mt = "%s USING I
18330 4e 44 45 58 20 25 73 25 73 22 3b 0a 20 20 20 20  NDEX %s%s";.    
18340 20 20 7d 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d    }.      zMsg =
18350 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
18360 28 64 62 2c 20 7a 4d 73 67 2c 20 7a 46 6d 74 2c  (db, zMsg, zFmt,
18370 20 7a 4d 73 67 2c 20 70 49 64 78 2d 3e 7a 4e 61   zMsg, pIdx->zNa
18380 6d 65 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20  me, zWhere);.   
18390 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
183a0 28 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20  (db, zWhere);.  
183b0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61    }else if( (fla
183c0 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
183d0 3d 30 20 26 26 20 28 66 6c 61 67 73 20 26 20 57  =0 && (flags & W
183e0 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29  HERE_CONSTRAINT)
183f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73  !=0 ){.      zMs
18400 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
18410 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
18420 73 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20  s USING INTEGER 
18430 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d  PRIMARY KEY", zM
18440 73 67 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  sg);..      if( 
18450 66 6c 61 67 73 26 28 57 48 45 52 45 5f 43 4f 4c  flags&(WHERE_COL
18460 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c  UMN_EQ|WHERE_COL
18470 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20  UMN_IN) ){.     
18480 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
18490 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
184a0 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3d 3f  sg, "%s (rowid=?
184b0 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
184c0 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
184d0 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d  s&WHERE_BOTH_LIM
184e0 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f  IT)==WHERE_BOTH_
184f0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20  LIMIT ){.       
18500 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
18510 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
18520 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 20 41  , "%s (rowid>? A
18530 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d  ND rowid<?)", zM
18540 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sg);.      }else
18550 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45   if( flags&WHERE
18560 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
18570 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
18580 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
18590 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
185a0 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d>?)", zMsg);.  
185b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
185c0 57 41 59 53 28 66 6c 61 67 73 26 57 48 45 52 45  WAYS(flags&WHERE
185d0 5f 54 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20  _TOP_LIMIT) ){. 
185e0 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
185f0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
18600 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
18610 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id<?)", zMsg);. 
18620 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
18630 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18640 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
18650 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67    else if( (flag
18660 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
18670 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
18680 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
18690 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
186a0 4d 73 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c  Msg, "%s VIRTUAL
186b0 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a   TABLE INDEX %d:
186c0 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20  %s", zMsg,.     
186d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
186e0 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75  op->u.vtab.idxNu
186f0 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  m, pLoop->u.vtab
18700 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a  .idxStr);.    }.
18710 23 65 6e 64 69 66 0a 20 20 20 20 7a 4d 73 67 20  #endif.    zMsg 
18720 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
18730 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 22  f(db, zMsg, "%s"
18740 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  , zMsg);.    sql
18750 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
18760 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49  , OP_Explain, iI
18770 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d  d, iLevel, iFrom
18780 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
18790 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
187a0 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
187b0 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78  nOneScan(u,v,w,x
187c0 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
187d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
187e0 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47  AIN */.../*.** G
187f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
18800 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
18810 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70  e iLevel-th loop
18820 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
18830 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  ause.** implemen
18840 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  tation described
18850 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73   by pWInfo..*/.s
18860 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
18870 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a  deOneLoopStart(.
18880 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
18890 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65  nfo,   /* Comple
188a0 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
188b0 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63  bout the WHERE c
188c0 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
188d0 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
188e0 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f  /* Which level o
188f0 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68  f pWInfo->a[] sh
18900 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f  ould be coded */
18910 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
18920 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68  ady     /* Which
18930 20 74 61 62 6c 65 73 20 61 72 65 20 63 75 72 72   tables are curr
18940 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20  ently available 
18950 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b  */.){.  int j, k
18960 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18970 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
18980 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
18990 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
189a0 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
189b0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
189c0 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20  t addrNxt;      
189d0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
189e0 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ump to continue 
189f0 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
18a00 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   case */.  int o
18a10 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20  mitTable;       
18a20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73  /* True if we us
18a30 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79  e the index only
18a40 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20   */.  int bRev; 
18a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
18a60 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ue if we need to
18a70 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   scan in reverse
18a80 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72   order */.  Wher
18a90 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
18aa0 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65   /* The where le
18ab0 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20  vel to be coded 
18ac0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
18ad0 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65  pLoop;    /* The
18ae0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
18af0 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
18b00 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
18b10 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d  pWC;    /* Decom
18b20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
18b30 65 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c 61  entire WHERE cla
18b40 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  use */.  WhereTe
18b50 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
18b60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48           /* A WH
18b70 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
18b80 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
18b90 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
18ba0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
18bb0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
18bc0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18be0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
18bf0 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ion */.  Vdbe *v
18c00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18c10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18c20 70 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e  prepared stmt un
18c30 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
18c40 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
18c50 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
18c60 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63  Item;  /* FROM c
18c70 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
18c80 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
18c90 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20  addrBrk;        
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
18cb0 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
18cc0 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  k out of the loo
18cd0 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
18ce0 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ont;            
18cf0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
18d00 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
18d10 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20  with next cycle 
18d20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52  */.  int iRowidR
18d30 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  eg = 0;        /
18d40 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65  * Rowid is store
18d50 64 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  d in this regist
18d60 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20  er, if not zero 
18d70 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73  */.  int iReleas
18d80 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f  eReg = 0;      /
18d90 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20  * Temp register 
18da0 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20 72  to free before r
18db0 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70  eturning */..  p
18dc0 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
18dd0 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50  pParse;.  v = pP
18de0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70  arse->pVdbe;.  p
18df0 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  WC = &pWInfo->sW
18e00 43 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  C;.  db = pParse
18e10 2d 3e 64 62 3b 0a 20 20 70 4c 65 76 65 6c 20 3d  ->db;.  pLevel =
18e20 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76   &pWInfo->a[iLev
18e30 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  el];.  pLoop = p
18e40 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
18e50 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49   pTabItem = &pWI
18e60 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
18e70 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
18e80 0a 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74  .  iCur = pTabIt
18e90 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70  em->iCursor;.  p
18ea0 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20  Level->notReady 
18eb0 3d 20 6e 6f 74 52 65 61 64 79 20 26 20 7e 67 65  = notReady & ~ge
18ec0 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
18ed0 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a  MaskSet, iCur);.
18ee0 20 20 62 52 65 76 20 3d 20 28 70 57 49 6e 66 6f    bRev = (pWInfo
18ef0 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69 4c 65 76 65  ->revMask>>iLeve
18f00 6c 29 26 31 3b 0a 20 20 6f 6d 69 74 54 61 62 6c  l)&1;.  omitTabl
18f10 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  e = (pLoop->wsFl
18f20 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
18f30 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20  ONLY)!=0 .      
18f40 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
18f50 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
18f60 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29  ERE_FORCE_TABLE)
18f70 3d 3d 30 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c  ==0;.  VdbeModul
18f80 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65  eComment((v, "Be
18f90 67 69 6e 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64  gin WHERE-loop%d
18fa0 3a 20 25 73 22 2c 69 4c 65 76 65 6c 2c 70 54 61  : %s",iLevel,pTa
18fb0 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  bItem->pTab->zNa
18fc0 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  me));..  /* Crea
18fd0 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68  te labels for th
18fe0 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63  e "break" and "c
18ff0 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63  ontinue" instruc
19000 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74  tions.  ** for t
19010 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e  he current loop.
19020 20 20 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72    Jump to addrBr
19030 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  k to break out o
19040 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a  f a loop..  ** J
19050 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67  ump to cont to g
19060 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  o immediately to
19070 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
19080 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
19090 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  loop..  **.  ** 
190a0 57 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e  When there is an
190b0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65   IN operator, we
190c0 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64   also have a "ad
190d0 64 72 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61  drNxt" label tha
190e0 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20  t.  ** means to 
190f0 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68  continue with th
19100 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20  e next IN value 
19110 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68  combination.  Wh
19120 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72  en.  ** there ar
19130 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72  e no IN operator
19140 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61  s in the constra
19150 69 6e 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e  ints, the "addrN
19160 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69  xt" label.  ** i
19170 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 22 61  s the same as "a
19180 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20  ddrBrk"..  */.  
19190 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c  addrBrk = pLevel
191a0 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76  ->addrBrk = pLev
191b0 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71  el->addrNxt = sq
191c0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
191d0 65 6c 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e  el(v);.  addrCon
191e0 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  t = pLevel->addr
191f0 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
19200 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
19210 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
19220 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
19230 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
19240 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20   JOIN, allocate 
19250 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  and.  ** initial
19260 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  ize a memory cel
19270 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 69  l that records i
19280 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74  f this table mat
19290 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f  ches any.  ** ro
192a0 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61  w of the left ta
192b0 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  ble of the join.
192c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76  .  */.  if( pLev
192d0 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28  el->iFrom>0 && (
192e0 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e  pTabItem[0].join
192f0 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
19300 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  =0 ){.    pLevel
19310 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b  ->iLeftJoin = ++
19320 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
19330 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19340 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
19350 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  r, 0, pLevel->iL
19360 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64  eftJoin);.    Vd
19370 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
19380 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f  nit LEFT JOIN no
19390 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a  -match flag"));.
193a0 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
193b0 6c 20 63 61 73 65 20 6f 66 20 61 20 46 52 4f 4d  l case of a FROM
193c0 20 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79   clause subquery
193d0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
193e0 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  a co-routine */.
193f0 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e    if( pTabItem->
19400 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  viaCoroutine ){.
19410 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64      int regYield
19420 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67   = pTabItem->reg
19430 52 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  Return;.    sqli
19440 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19450 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
19460 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20  e, regYield, 0, 
19470 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69  pTabItem->addrFi
19480 6c 6c 53 75 62 29 3b 0a 20 20 20 20 70 4c 65 76  llSub);.    pLev
19490 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74 65  el->p2 =  sqlite
194a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
194b0 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c  P_Yield, regYiel
194c0 64 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  d, addrBrk);.   
194d0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
194e0 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
194f0 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20  t((v, "next row 
19500 6f 66 20 5c 22 25 73 5c 22 22 2c 20 70 54 61 62  of \"%s\"", pTab
19510 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
19520 65 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  e));.    pLevel-
19530 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20  >op = OP_Goto;. 
19540 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20   }else..#ifndef 
19550 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
19560 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20  UALTABLE.  if(  
19570 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
19580 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
19590 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
195a0 2f 2a 20 43 61 73 65 20 31 3a 20 20 54 68 65 20  /* Case 1:  The 
195b0 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75  table is a virtu
195c0 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74  al-table.  Use t
195d0 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56  he VFilter and V
195e0 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  Next.    **     
195f0 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20 74       to access t
19600 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  he data..    */.
19610 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20      int iReg;   
19620 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20  /* P3 Value for 
19630 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20  OP_VFilter */.  
19640 20 20 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75    int addrNotFou
19650 6e 64 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e  nd;.    int nCon
19660 73 74 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d  straint = pLoop-
19670 3e 6e 4c 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71  >nLTerm;..    sq
19680 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
19690 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
196a0 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  iReg = sqlite3Ge
196b0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
196c0 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32  e, nConstraint+2
196d0 29 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74 46 6f  );.    addrNotFo
196e0 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  und = pLevel->ad
196f0 64 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a  drBrk;.    for(j
19700 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; j<nConstrain
19710 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  t; j++){.      i
19720 6e 74 20 69 54 61 72 67 65 74 20 3d 20 69 52 65  nt iTarget = iRe
19730 67 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54 65  g+j+2;.      pTe
19740 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rm = pLoop->aLTe
19750 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  rm[j];.      if(
19760 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74   pTerm==0 ) cont
19770 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
19780 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
19790 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
197a0 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79      codeEquality
197b0 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
197c0 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62  rm, pLevel, j, b
197d0 52 65 76 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  Rev, iTarget);. 
197e0 20 20 20 20 20 20 20 61 64 64 72 4e 6f 74 46 6f         addrNotFo
197f0 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  und = pLevel->ad
19800 64 72 4e 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  drNxt;.      }el
19810 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
19820 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
19830 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
19840 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65  ->pRight, iTarge
19850 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
19860 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
19870 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
19880 74 65 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e  teger, pLoop->u.
19890 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65  vtab.idxNum, iRe
198a0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  g);.    sqlite3V
198b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
198c0 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72  Integer, nConstr
198d0 61 69 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20  aint, iReg+1);. 
198e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
198f0 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74  dOp4(v, OP_VFilt
19900 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 6f  er, iCur, addrNo
19910 74 46 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20  tFound, iReg,.  
19920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19930 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61      pLoop->u.vta
19940 62 2e 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20  b.idxStr,.      
19950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19960 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65  pLoop->u.vtab.ne
19970 65 64 46 72 65 65 20 3f 20 50 34 5f 4d 50 52 49  edFree ? P4_MPRI
19980 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29  NTF : P4_STATIC)
19990 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
199a0 67 65 28 76 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  ge(v);.    pLoop
199b0 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
199c0 65 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a  e = 0;.    for(j
199d0 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; j<nConstrain
199e0 74 20 26 26 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b  t && j<16; j++){
199f0 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  .      if( (pLoo
19a00 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
19a10 73 6b 3e 3e 6a 29 26 31 20 29 7b 0a 20 20 20 20  sk>>j)&1 ){.    
19a20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
19a30 70 4c 65 76 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61  pLevel, pLoop->a
19a40 4c 54 65 72 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20  LTerm[j]);.     
19a50 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65   }.    }.    pLe
19a60 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65  vel->op = OP_VNe
19a70 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  xt;.    pLevel->
19a80 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  p1 = iCur;.    p
19a90 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69  Level->p2 = sqli
19aa0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
19ab0 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
19ac0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
19ad0 67 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c  ge(pParse, iReg,
19ae0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
19af0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
19b00 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
19b10 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
19b20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
19b30 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
19b40 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  .  if( (pLoop->w
19b50 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
19b60 50 4b 29 21 3d 30 0a 20 20 20 26 26 20 28 70 4c  PK)!=0.   && (pL
19b70 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
19b80 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c  WHERE_COLUMN_IN|
19b90 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29  WHERE_COLUMN_EQ)
19ba0 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  )!=0.  ){.    /*
19bb0 20 43 61 73 65 20 32 3a 20 20 57 65 20 63 61 6e   Case 2:  We can
19bc0 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65   directly refere
19bd0 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nce a single row
19be0 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
19bf0 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c 69            equali
19c00 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
19c10 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
19c20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a  field.  Or.    *
19c30 2a 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65  *          we re
19c40 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65  ference multiple
19c50 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72   rows using a "r
19c60 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20  owid IN (...)". 
19c70 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63     **          c
19c80 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f  onstruct..    */
19c90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
19ca0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d  op->u.btree.nEq=
19cb0 3d 31 20 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  =1 );.    pTerm 
19cc0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
19cd0 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0];.    assert( 
19ce0 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
19cf0 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70  assert( pTerm->p
19d00 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 61  Expr!=0 );.    a
19d10 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
19d20 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==0 );.    testc
19d30 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
19d40 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
19d50 41 4c 20 29 3b 0a 20 20 20 20 69 52 65 6c 65 61  AL );.    iRelea
19d60 73 65 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65  seReg = ++pParse
19d70 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 52 6f 77  ->nMem;.    iRow
19d80 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61  idReg = codeEqua
19d90 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
19da0 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20   pTerm, pLevel, 
19db0 30 2c 20 62 52 65 76 2c 20 69 52 65 6c 65 61 73  0, bRev, iReleas
19dc0 65 52 65 67 29 3b 0a 20 20 20 20 69 66 28 20 69  eReg);.    if( i
19dd0 52 6f 77 69 64 52 65 67 21 3d 69 52 65 6c 65 61  RowidReg!=iRelea
19de0 73 65 52 65 67 20 29 20 73 71 6c 69 74 65 33 52  seReg ) sqlite3R
19df0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
19e00 61 72 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65  arse, iReleaseRe
19e10 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20  g);.    addrNxt 
19e20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
19e30 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
19e40 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
19e50 75 73 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64  ustBeInt, iRowid
19e60 52 65 67 2c 20 61 64 64 72 4e 78 74 29 3b 20 56  Reg, addrNxt); V
19e70 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19e80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19e90 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45  ddOp3(v, OP_NotE
19ea0 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64  xists, iCur, add
19eb0 72 4e 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29  rNxt, iRowidReg)
19ec0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
19ed0 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
19ee0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
19ef0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
19f00 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 31 29 3b  , iRowidReg, 1);
19f10 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
19f20 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73  CacheStore(pPars
19f30 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f  e, iCur, -1, iRo
19f40 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62  widReg);.    Vdb
19f50 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
19f60 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  "));.    pLevel-
19f70 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  >op = OP_Noop;. 
19f80 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f   }else if( (pLoo
19f90 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
19fa0 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20 20  RE_IPK)!=0.     
19fb0 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77      && (pLoop->w
19fc0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
19fd0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a  OLUMN_RANGE)!=0.
19fe0 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65    ){.    /* Case
19ff0 20 33 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20   3:  We have an 
1a000 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61  inequality compa
1a010 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
1a020 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20  e ROWID field.. 
1a030 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65     */.    int te
1a040 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  stOp = OP_Noop;.
1a050 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20      int start;. 
1a060 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c     int memEndVal
1a070 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72  ue = 0;.    Wher
1a080 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a  eTerm *pStart, *
1a090 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72  pEnd;..    asser
1a0a0 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
1a0b0 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  );.    j = 0;.  
1a0c0 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 20    pStart = pEnd 
1a0d0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  = 0;.    if( pLo
1a0e0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1a0f0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20  ERE_BTM_LIMIT ) 
1a100 70 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e  pStart = pLoop->
1a110 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20  aLTerm[j++];.   
1a120 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1a130 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
1a140 4c 49 4d 49 54 20 29 20 70 45 6e 64 20 3d 20 70  LIMIT ) pEnd = p
1a150 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b  Loop->aLTerm[j++
1a160 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
1a170 53 74 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64  Start!=0 || pEnd
1a180 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 62  !=0 );.    if( b
1a190 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65  Rev ){.      pTe
1a1a0 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20  rm = pStart;.   
1a1b0 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64     pStart = pEnd
1a1c0 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70  ;.      pEnd = p
1a1d0 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Term;.    }.    
1a1e0 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
1a1f0 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20      Expr *pX;   
1a200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a210 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
1a220 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 74 61   defines the sta
1a230 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  rt bound */.    
1a240 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b    int r1, rTemp;
1a250 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1a260 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67  ters for holding
1a270 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64   the start bound
1a280 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ary */..      /*
1a290 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
1a2a0 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f  onstant maps TK_
1a2b0 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f  xx codes into co
1a2c0 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20  rresponding .   
1a2d0 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64     ** seek opcod
1a2e0 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20  es.  It depends 
1a2f0 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  on a particular 
1a300 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78  ordering of TK_x
1a310 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  x.      */.     
1a320 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f   const u8 aMoveO
1a330 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  p[] = {.        
1a340 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20     /* TK_GT */  
1a350 4f 50 5f 53 65 65 6b 47 54 2c 0a 20 20 20 20 20  OP_SeekGT,.     
1a360 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a        /* TK_LE *
1a370 2f 20 20 4f 50 5f 53 65 65 6b 4c 45 2c 0a 20 20  /  OP_SeekLE,.  
1a380 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c           /* TK_L
1a390 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 54 2c  T */  OP_SeekLT,
1a3a0 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
1a3b0 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_GE */  OP_Seek
1a3c0 47 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  GE.      };.    
1a3d0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
1a3e0 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20  =TK_GT+1 );     
1a3f0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
1a400 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a  e ordering.. */.
1a410 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1a420 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20  _LT==TK_GT+2 ); 
1a430 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20       /*  ... of 
1a440 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73  the TK_xx values
1a450 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ... */.      ass
1a460 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47  ert( TK_GE==TK_G
1a470 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20  T+3 );      /*  
1a480 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e  ... is correcct.
1a490 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
1a4a0 74 28 20 28 70 53 74 61 72 74 2d 3e 77 74 46 6c  t( (pStart->wtFl
1a4b0 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
1a4c0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  )==0 );.      te
1a4d0 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e  stcase( pStart->
1a4e0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1a4f0 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
1a500 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78  pX = pStart->pEx
1a510 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
1a520 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
1a530 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61 72   testcase( pStar
1a540 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  t->leftCursor!=i
1a550 43 75 72 20 29 3b 20 2f 2a 20 74 72 61 6e 73 69  Cur ); /* transi
1a560 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  tive constraints
1a570 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73   */.      r1 = s
1a580 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1a590 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  mp(pParse, pX->p
1a5a0 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a  Right, &rTemp);.
1a5b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a5c0 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65  eAddOp3(v, aMove
1a5d0 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d  Op[pX->op-TK_GT]
1a5e0 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c  , iCur, addrBrk,
1a5f0 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65   r1);.      Vdbe
1a600 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
1a610 29 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  ));.      VdbeCo
1a620 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e  verageIf(v, pX->
1a630 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20  op==TK_GT);.    
1a640 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1a650 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c  (v, pX->op==TK_L
1a660 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  E);.      VdbeCo
1a670 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e  verageIf(v, pX->
1a680 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20  op==TK_LT);.    
1a690 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1a6a0 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47  (v, pX->op==TK_G
1a6b0 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  E);.      sqlite
1a6c0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1a6d0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1a6e0 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73   r1, 1);.      s
1a6f0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1a700 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 54 65  pReg(pParse, rTe
1a710 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62  mp);.      disab
1a720 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
1a730 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73  Start);.    }els
1a740 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1a750 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52  VdbeAddOp2(v, bR
1a760 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f  ev ? OP_Last : O
1a770 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20  P_Rewind, iCur, 
1a780 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20  addrBrk);.      
1a790 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1a7a0 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20  , bRev==0);.    
1a7b0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1a7c0 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20  (v, bRev!=0);.  
1a7d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64    }.    if( pEnd
1a7e0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
1a7f0 70 58 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70  pX;.      pX = p
1a800 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  End->pExpr;.    
1a810 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
1a820 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a830 20 28 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20   (pEnd->wtFlags 
1a840 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
1a850 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1a860 73 65 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75  se( pEnd->leftCu
1a870 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a  rsor!=iCur ); /*
1a880 20 54 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73   Transitive cons
1a890 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20  traints */.     
1a8a0 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d   testcase( pEnd-
1a8b0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1a8c0 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
1a8d0 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b   memEndValue = +
1a8e0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1a8f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1a900 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d  Code(pParse, pX-
1a910 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56  >pRight, memEndV
1a920 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28  alue);.      if(
1a930 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c   pX->op==TK_LT |
1a940 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  | pX->op==TK_GT 
1a950 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  ){.        testO
1a960 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65  p = bRev ? OP_Le
1a970 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20   : OP_Ge;.      
1a980 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
1a990 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
1a9a0 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20  P_Lt : OP_Gt;.  
1a9b0 20 20 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61      }.      disa
1a9c0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1a9d0 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pEnd);.    }.   
1a9e0 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
1a9f0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1aa00 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  v);.    pLevel->
1aa10 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50  op = bRev ? OP_P
1aa20 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20  rev : OP_Next;. 
1aa30 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1aa40 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
1aa50 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20  ->p2 = start;.  
1aa60 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
1aa70 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ->p5==0 );.    i
1aa80 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f  f( testOp!=OP_No
1aa90 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77  op ){.      iRow
1aaa0 69 64 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65  idReg = ++pParse
1aab0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
1aac0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1aad0 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75  v, OP_Rowid, iCu
1aae0 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  r, iRowidReg);. 
1aaf0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ab00 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73  CacheStore(pPars
1ab10 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f  e, iCur, -1, iRo
1ab20 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
1ab30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1ab40 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45  (v, testOp, memE
1ab50 6e 64 56 61 6c 75 65 2c 20 61 64 64 72 42 72 6b  ndValue, addrBrk
1ab60 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1ab70 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1ab80 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50  If(v, testOp==OP
1ab90 5f 4c 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Le);.      Vdbe
1aba0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74 65  CoverageIf(v, te
1abb0 73 74 4f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  stOp==OP_Lt);.  
1abc0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1abd0 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50  If(v, testOp==OP
1abe0 5f 47 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Ge);.      Vdbe
1abf0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74 65  CoverageIf(v, te
1ac00 73 74 4f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  stOp==OP_Gt);.  
1ac10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1ac20 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
1ac30 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20  E_AFF_NUMERIC | 
1ac40 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1ac50 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  L);.    }.  }els
1ac60 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46  e if( pLoop->wsF
1ac70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
1ac80 45 58 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 43  EXED ){.    /* C
1ac90 61 73 65 20 34 3a 20 41 20 73 63 61 6e 20 75 73  ase 4: A scan us
1aca0 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20  ing an index..  
1acb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1acc0 20 20 20 20 54 68 65 20 57 48 45 52 45 20 63 6c      The WHERE cl
1acd0 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  ause may contain
1ace0 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71   zero or more eq
1acf0 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 20  uality .    **  
1ad00 20 20 20 20 20 20 20 74 65 72 6d 73 20 28 22 3d         terms ("=
1ad10 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61  =" or "IN" opera
1ad20 74 6f 72 73 29 20 74 68 61 74 20 72 65 66 65 72  tors) that refer
1ad30 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a   to the N.    **
1ad40 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f           left-mo
1ad50 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  st columns of th
1ad60 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20  e index. It may 
1ad70 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20  also contain.   
1ad80 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71   **         ineq
1ad90 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1ada0 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20  ts (>, <, >= or 
1adb0 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78  <=) on the index
1adc0 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ed.    **       
1add0 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d    column that im
1ade0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
1adf0 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69 74 69  s the N equaliti
1ae00 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a  es. Only .    **
1ae10 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
1ae20 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63  ht-most column c
1ae30 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c  an be an inequal
1ae40 69 74 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d  ity - the rest m
1ae50 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ust.    **      
1ae60 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20     use the "==" 
1ae70 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f  and "IN" operato
1ae80 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  rs. For example,
1ae90 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   if the .    ** 
1aea0 20 20 20 20 20 20 20 20 69 6e 64 65 78 20 69 73          index is
1aeb0 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65   on (x,y,z), the
1aec0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
1aed0 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c 20  clauses are all 
1aee0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1aef0 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a  optimized:.    *
1af00 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1af10 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20      x=5.    **  
1af20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
1af30 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20  D y=10.    **   
1af40 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
1af50 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20   y<10.    **    
1af60 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1af70 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20  y>5 AND y<10.   
1af80 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1af90 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a  =5 AND y=5 AND z
1afa0 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20  <=10.    **.    
1afb0 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 7a  **         The z
1afc0 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68 65 20  <10 term of the 
1afd0 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74  following cannot
1afe0 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20   be used, only. 
1aff0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68     **         th
1b000 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20  e x=5 term:.    
1b010 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1b020 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31       x=5 AND z<1
1b030 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  0.    **.    ** 
1b040 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65          N may be
1b050 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61   zero if there a
1b060 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  re inequality co
1b070 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a  nstraints..    *
1b080 2a 20 20 20 20 20 20 20 20 20 49 66 20 74 68 65  *         If the
1b090 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61  re are no inequa
1b0a0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1b0b0 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20  , then N is at. 
1b0c0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65     **         le
1b0d0 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a  ast one..    **.
1b0e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
1b0f0 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f  his case is also
1b100 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 72 65   used when there
1b110 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c   are no WHERE cl
1b120 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  ause.    **     
1b130 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20      constraints 
1b140 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20  but an index is 
1b150 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c  selected anyway,
1b160 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a   in order.    **
1b170 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63           to forc
1b180 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64  e the output ord
1b190 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f  er to conform to
1b1a0 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20   an ORDER BY..  
1b1b0 20 20 2a 2f 20 20 0a 20 20 20 20 73 74 61 74 69    */  .    stati
1b1c0 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72  c const u8 aStar
1b1d0 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  tOp[] = {.      
1b1e0 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20  0,.      0,.    
1b1f0 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20    OP_Rewind,    
1b200 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73         /* 2: (!s
1b210 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1b220 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20   && startEq &&  
1b230 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1b240 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20  OP_Last,        
1b250 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61       /* 3: (!sta
1b260 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  rt_constraints &
1b270 26 20 73 74 61 72 74 45 71 20 26 26 20 20 20 62  & startEq &&   b
1b280 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1b290 5f 53 65 65 6b 47 54 2c 20 20 20 20 20 20 20 20  _SeekGT,        
1b2a0 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f     /* 4: (start_
1b2b0 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
1b2c0 21 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65  !startEq && !bRe
1b2d0 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
1b2e0 65 65 6b 4c 54 2c 20 20 20 20 20 20 20 20 20 20  eekLT,          
1b2f0 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f   /* 5: (start_co
1b300 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73  nstraints  && !s
1b310 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29  tartEq &&  bRev)
1b320 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
1b330 6b 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kGE,           /
1b340 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 6: (start_cons
1b350 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61  traints  &&  sta
1b360 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a  rtEq && !bRev) *
1b370 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c  /.      OP_SeekL
1b380 45 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  E            /* 
1b390 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  7: (start_constr
1b3a0 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74  aints  &&  start
1b3b0 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a  Eq &&  bRev) */.
1b3c0 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 61 74 69      };.    stati
1b3d0 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f  c const u8 aEndO
1b3e0 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50  p[] = {.      OP
1b3f0 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20 20 20  _IdxGE,         
1b400 20 20 20 2f 2a 20 30 3a 20 28 65 6e 64 5f 63 6f     /* 0: (end_co
1b410 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52  nstraints && !bR
1b420 65 76 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f  ev && !endEq) */
1b430 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47 54 2c  .      OP_IdxGT,
1b440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
1b450 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
1b460 74 73 20 26 26 20 21 62 52 65 76 20 26 26 20 20  ts && !bRev &&  
1b470 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 20 20  endEq) */.      
1b480 4f 50 5f 49 64 78 4c 45 2c 20 20 20 20 20 20 20  OP_IdxLE,       
1b490 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f       /* 2: (end_
1b4a0 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 20  constraints &&  
1b4b0 62 52 65 76 20 26 26 20 21 65 6e 64 45 71 29 20  bRev && !endEq) 
1b4c0 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c  */.      OP_IdxL
1b4d0 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  T,            /*
1b4e0 20 33 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   3: (end_constra
1b4f0 69 6e 74 73 20 26 26 20 20 62 52 65 76 20 26 26  ints &&  bRev &&
1b500 20 20 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20    endEq) */.    
1b510 7d 3b 0a 20 20 20 20 75 31 36 20 6e 45 71 20 3d  };.    u16 nEq =
1b520 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1b530 6e 45 71 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  nEq;     /* Numb
1b540 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74  er of == or IN t
1b550 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  erms */.    int 
1b560 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
1b570 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65           /* Base
1b580 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
1b590 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c  g constraint val
1b5a0 75 65 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  ues */.    Where
1b5b0 54 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72  Term *pRangeStar
1b5c0 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75  t = 0;  /* Inequ
1b5d0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1b5e0 20 61 74 20 72 61 6e 67 65 20 73 74 61 72 74 20   at range start 
1b5f0 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1b600 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b   *pRangeEnd = 0;
1b610 20 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74      /* Inequalit
1b620 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
1b630 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20  range end */.   
1b640 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20   int startEq;   
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b660 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 73   True if range s
1b670 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d  tart uses ==, >=
1b680 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e   or <= */.    in
1b690 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20  t endEq;        
1b6a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1b6b0 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20  ue if range end 
1b6c0 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c  uses ==, >= or <
1b6d0 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61  = */.    int sta
1b6e0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20  rt_constraints; 
1b6f0 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
1b700 66 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74  f range is const
1b710 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e  rained */.    in
1b720 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20  t nConstraint;  
1b730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1b740 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69  mber of constrai
1b750 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  nt terms */.    
1b760 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
1b770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b780 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c  The index we wil
1b790 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20  l be using */.  
1b7a0 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20    int iIdxCur;  
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b7c0 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
1b7d0 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  r for the index 
1b7e0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72  */.    int nExtr
1b7f0 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  aReg = 0;       
1b800 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b810 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73   extra registers
1b820 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69   needed */.    i
1b830 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
1b840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1b850 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64  nstruction opcod
1b860 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
1b870 53 74 61 72 74 41 66 66 3b 20 20 20 20 20 20 20  StartAff;       
1b880 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
1b890 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72  y for start of r
1b8a0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
1b8b0 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 45 6e 64  */.    char cEnd
1b8c0 41 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Aff = 0;        
1b8d0 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
1b8e0 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65  for end of range
1b8f0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
1b900 20 20 20 75 38 20 62 53 65 65 6b 50 61 73 74 4e     u8 bSeekPastN
1b910 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ull = 0;        
1b920 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 65 6b 20  /* True to seek 
1b930 70 61 73 74 20 69 6e 69 74 69 61 6c 20 6e 75 6c  past initial nul
1b940 6c 73 20 2a 2f 0a 20 20 20 20 75 38 20 62 53 74  ls */.    u8 bSt
1b950 6f 70 41 74 4e 75 6c 6c 20 3d 20 30 3b 20 20 20  opAtNull = 0;   
1b960 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f         /* Add co
1b970 6e 64 69 74 69 6f 6e 20 74 6f 20 74 65 72 6d 69  ndition to termi
1b980 6e 61 74 65 20 61 74 20 4e 55 4c 4c 73 20 2a 2f  nate at NULLs */
1b990 0a 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f  ..    pIdx = pLo
1b9a0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
1b9b0 65 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20  ex;.    iIdxCur 
1b9c0 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
1b9d0 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  r;.    assert( n
1b9e0 45 71 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  Eq>=pLoop->u.btr
1b9f0 65 65 2e 6e 53 6b 69 70 20 29 3b 0a 0a 20 20 20  ee.nSkip );..   
1ba00 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70   /* If this loop
1ba10 20 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72   satisfies a sor
1ba20 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42  t order (pOrderB
1ba30 79 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20  y) request that 
1ba40 0a 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73  .    ** was pass
1ba50 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
1ba60 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ion to implement
1ba70 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
1ba80 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71  ) ..." .    ** q
1ba90 75 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63  uery, then the c
1baa0 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20  aller will only 
1bab0 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74  allow the loop t
1bac0 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a  o run for.    **
1bad0 20 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74   a single iterat
1bae0 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
1baf0 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72  that the first r
1bb00 6f 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20  ow returned.    
1bb10 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61  ** should not ha
1bb20 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  ve a NULL value 
1bb30 73 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49  stored in 'x'. I
1bb40 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a  f column 'x' is.
1bb50 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74      ** the first
1bb60 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e   one after the n
1bb70 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  Eq equality cons
1bb80 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69  traints in the i
1bb90 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69  ndex,.    ** thi
1bba0 73 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20  s requires some 
1bbb0 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
1bbc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1bbd0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  ert( pWInfo->pOr
1bbe0 64 65 72 42 79 3d 3d 30 0a 20 20 20 20 20 20 20  derBy==0.       
1bbf0 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72    || pWInfo->pOr
1bc00 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 0a  derBy->nExpr==1.
1bc10 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 57 49           || (pWI
1bc20 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26  nfo->wctrlFlags&
1bc30 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
1bc40 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  N)==0 );.    if(
1bc50 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
1bc60 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
1bc70 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20  BY_MIN)!=0.     
1bc80 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  && pWInfo->nOBSa
1bc90 74 3e 30 0a 20 20 20 20 20 26 26 20 28 70 49 64  t>0.     && (pId
1bca0 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 71 29 0a  x->nKeyCol>nEq).
1bcb0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
1bcc0 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ert( pLoop->u.bt
1bcd0 72 65 65 2e 6e 53 6b 69 70 3d 3d 30 20 29 3b 0a  ree.nSkip==0 );.
1bce0 20 20 20 20 20 20 62 53 65 65 6b 50 61 73 74 4e        bSeekPastN
1bcf0 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e  ull = 1;.      n
1bd00 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
1bd10 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64    }..    /* Find
1bd20 20 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20   any inequality 
1bd30 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
1bd40 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61   for the start a
1bd50 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f  nd end .    ** o
1bd60 66 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20  f the range. .  
1bd70 20 20 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71    */.    j = nEq
1bd80 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ;.    if( pLoop-
1bd90 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1bda0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
1bdb0 20 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20      pRangeStart 
1bdc0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1bdd0 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74  j++];.      nExt
1bde0 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d  raReg = 1;.    }
1bdf0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1be00 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1be10 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
1be20 20 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70     pRangeEnd = p
1be30 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b  Loop->aLTerm[j++
1be40 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52  ];.      nExtraR
1be50 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  eg = 1;.      if
1be60 28 20 70 52 61 6e 67 65 53 74 61 72 74 3d 3d 30  ( pRangeStart==0
1be70 0a 20 20 20 20 20 20 20 26 26 20 28 6a 20 3d 20  .       && (j = 
1be80 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
1be90 45 71 5d 29 3e 3d 30 20 0a 20 20 20 20 20 20 20  Eq])>=0 .       
1bea0 26 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d  && pIdx->pTable-
1beb0 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[j].notNull
1bec0 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
1bed0 20 20 20 20 20 62 53 65 65 6b 50 61 73 74 4e 75       bSeekPastNu
1bee0 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ll = 1;.      }.
1bef0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1bf00 28 20 70 52 61 6e 67 65 45 6e 64 3d 3d 30 20 7c  ( pRangeEnd==0 |
1bf10 7c 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  | (pRangeEnd->wt
1bf20 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
1bf30 4c 4c 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f  LL)==0 );..    /
1bf40 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1bf50 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  to evaluate all 
1bf60 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
1bf70 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a   using == or IN.
1bf80 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65      ** and store
1bf90 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74   the values of t
1bfa0 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e  hose terms in an
1bfb0 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
1bfc0 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
1bfd0 69 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a  ing at regBase..
1bfe0 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61      */.    regBa
1bff0 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61  se = codeAllEqua
1c000 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72 73 65  lityTerms(pParse
1c010 2c 70 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78  ,pLevel,bRev,nEx
1c020 74 72 61 52 65 67 2c 26 7a 53 74 61 72 74 41 66  traReg,&zStartAf
1c030 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  f);.    assert( 
1c040 7a 53 74 61 72 74 41 66 66 3d 3d 30 20 7c 7c 20  zStartAff==0 || 
1c050 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1c060 7a 53 74 61 72 74 41 66 66 29 3e 3d 6e 45 71 20  zStartAff)>=nEq 
1c070 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 74 61 72  );.    if( zStar
1c080 74 41 66 66 20 29 20 63 45 6e 64 41 66 66 20 3d  tAff ) cEndAff =
1c090 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 3b   zStartAff[nEq];
1c0a0 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70  .    addrNxt = p
1c0b0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
1c0c0 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
1c0d0 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73  e doing a revers
1c0e0 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  e order scan on 
1c0f0 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
1c100 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  ex, or.    ** a 
1c110 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63  forward order sc
1c120 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69  an on a descendi
1c130 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63  ng index, interc
1c140 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a  hange the .    *
1c150 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  * start and end 
1c160 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61  terms (pRangeSta
1c170 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64  rt and pRangeEnd
1c180 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
1c190 28 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 4b 65  ( (nEq<pIdx->nKe
1c1a0 79 43 6f 6c 20 26 26 20 62 52 65 76 3d 3d 28 70  yCol && bRev==(p
1c1b0 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
1c1c0 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  nEq]==SQLITE_SO_
1c1d0 41 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62  ASC)).     || (b
1c1e0 52 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 4b 65  Rev && pIdx->nKe
1c1f0 79 43 6f 6c 3d 3d 6e 45 71 29 0a 20 20 20 20 29  yCol==nEq).    )
1c200 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65  {.      SWAP(Whe
1c210 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65  reTerm *, pRange
1c220 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74  End, pRangeStart
1c230 29 3b 0a 20 20 20 20 20 20 53 57 41 50 28 75 38  );.      SWAP(u8
1c240 2c 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c  , bSeekPastNull,
1c250 20 62 53 74 6f 70 41 74 4e 75 6c 6c 29 3b 0a 20   bStopAtNull);. 
1c260 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61     }..    testca
1c270 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
1c280 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d  && (pRangeStart-
1c290 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1c2a0 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  LE)!=0 );.    te
1c2b0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
1c2c0 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74  art && (pRangeSt
1c2d0 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
1c2e0 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20   WO_GE)!=0 );.  
1c2f0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1c300 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65  geEnd && (pRange
1c310 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
1c320 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20   WO_LE)!=0 );.  
1c330 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1c340 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65  geEnd && (pRange
1c350 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
1c360 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20   WO_GE)!=0 );.  
1c370 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61    startEq = !pRa
1c380 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e  ngeStart || pRan
1c390 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
1c3a0 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
1c3b0 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20  E);.    endEq = 
1c3c0 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20    !pRangeEnd || 
1c3d0 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
1c3e0 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
1c3f0 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f  _GE);.    start_
1c400 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52  constraints = pR
1c410 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71  angeStart || nEq
1c420 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  >0;..    /* Seek
1c430 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
1c440 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
1c450 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
1c460 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
1c470 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
1c480 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20  RangeStart ){.  
1c490 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
1c4a0 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e   = pRangeStart->
1c4b0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
1c4c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1c4d0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
1c4e0 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
1c4f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52  );.      if( (pR
1c500 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
1c510 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
1c520 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 73 71  ==0.       && sq
1c530 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
1c540 6c 6c 28 70 52 69 67 68 74 29 0a 20 20 20 20 20  ll(pRight).     
1c550 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1c560 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c570 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42   OP_IsNull, regB
1c580 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74  ase+nEq, addrNxt
1c590 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
1c5a0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1c5b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53    }.      if( zS
1c5c0 74 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20  tartAff ){.     
1c5d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
1c5e0 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
1c5f0 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b  ight, zStartAff[
1c600 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  nEq])==SQLITE_AF
1c610 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20  F_NONE){.       
1c620 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20     /* Since the 
1c630 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f  comparison is to
1c640 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69   be performed wi
1c650 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  th no conversion
1c660 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
1c670 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70  pplied to the op
1c680 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20  erands, set the 
1c690 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c  affinity to appl
1c6a0 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a  y to pRight to .
1c6b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
1c6c0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a  ITE_AFF_NONE.  *
1c6d0 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61  /.          zSta
1c6e0 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c  rtAff[nEq] = SQL
1c6f0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
1c700 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c710 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e  if( sqlite3ExprN
1c720 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
1c730 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74  ange(pRight, zSt
1c740 61 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a  artAff[nEq]) ){.
1c750 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74            zStart
1c760 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
1c770 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1c780 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a      }.      }  .
1c790 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
1c7a0 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t++;.      testc
1c7b0 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
1c7c0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1c7d0 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
1c7e0 7d 65 6c 73 65 20 69 66 28 20 62 53 65 65 6b 50  }else if( bSeekP
1c7f0 61 73 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  astNull ){.     
1c800 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c810 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1c820 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
1c830 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
1c840 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74  t++;.      start
1c850 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  Eq = 0;.      st
1c860 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1c870 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  = 1;.    }.    c
1c880 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
1c890 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
1c8a0 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 2d 20  , nConstraint - 
1c8b0 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 7a  bSeekPastNull, z
1c8c0 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f  StartAff);.    o
1c8d0 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74  p = aStartOp[(st
1c8e0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c  art_constraints<
1c8f0 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c  <2) + (startEq<<
1c900 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20  1) + bRev];.    
1c910 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b  assert( op!=0 );
1c920 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c930 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
1c940 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
1c950 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  t, regBase, nCon
1c960 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 56 64  straint);.    Vd
1c970 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1c980 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1c990 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 52 65 77 69  f(v, op==OP_Rewi
1c9a0 6e 64 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  nd);  testcase( 
1c9b0 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b  op==OP_Rewind );
1c9c0 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1c9d0 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 61  eIf(v, op==OP_La
1c9e0 73 74 29 3b 20 20 20 20 74 65 73 74 63 61 73 65  st);    testcase
1c9f0 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b  ( op==OP_Last );
1ca00 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1ca10 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65  eIf(v, op==OP_Se
1ca20 65 6b 47 54 29 3b 20 20 74 65 73 74 63 61 73 65  ekGT);  testcase
1ca30 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 20  ( op==OP_SeekGT 
1ca40 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1ca50 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
1ca60 53 65 65 6b 47 45 29 3b 20 20 74 65 73 74 63 61  SeekGE);  testca
1ca70 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  se( op==OP_SeekG
1ca80 45 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  E );.    VdbeCov
1ca90 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
1caa0 50 5f 53 65 65 6b 4c 45 29 3b 20 20 74 65 73 74  P_SeekLE);  test
1cab0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
1cac0 6b 4c 45 20 29 3b 0a 20 20 20 20 56 64 62 65 43  kLE );.    VdbeC
1cad0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1cae0 3d 4f 50 5f 53 65 65 6b 4c 54 29 3b 20 20 74 65  =OP_SeekLT);  te
1caf0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
1cb00 65 65 6b 4c 54 20 29 3b 0a 0a 20 20 20 20 2f 2a  eekLT );..    /*
1cb10 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20   Load the value 
1cb20 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69  for the inequali
1cb30 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
1cb40 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
1cb50 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66      ** range (if
1cb60 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20   any)..    */.  
1cb70 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
1cb80 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61  nEq;.    if( pRa
1cb90 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ngeEnd ){.      
1cba0 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
1cbb0 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d  RangeEnd->pExpr-
1cbc0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73  >pRight;.      s
1cbd0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
1cbe0 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  emove(pParse, re
1cbf0 67 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20  gBase+nEq, 1);. 
1cc00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1cc10 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
1cc20 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
1cc30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52  );.      if( (pR
1cc40 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
1cc50 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
1cc60 30 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  0.       && sqli
1cc70 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
1cc80 28 70 52 69 67 68 74 29 0a 20 20 20 20 20 20 29  (pRight).      )
1cc90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1cca0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ccb0 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73  P_IsNull, regBas
1ccc0 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b  e+nEq, addrNxt);
1ccd0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
1cce0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
1ccf0 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
1cd00 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1cd10 74 79 28 70 52 69 67 68 74 2c 20 63 45 6e 64 41  ty(pRight, cEndA
1cd20 66 66 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ff)!=SQLITE_AFF_
1cd30 4e 4f 4e 45 0a 20 20 20 20 20 20 20 26 26 20 21  NONE.       && !
1cd40 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
1cd50 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
1cd60 28 70 52 69 67 68 74 2c 20 63 45 6e 64 41 66 66  (pRight, cEndAff
1cd70 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
1cd80 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
1cd90 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
1cda0 42 61 73 65 2b 6e 45 71 2c 20 31 2c 20 26 63 45  Base+nEq, 1, &cE
1cdb0 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a  ndAff);.      }.
1cdc0 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
1cdd0 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t++;.      testc
1cde0 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e  ase( pRangeEnd->
1cdf0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1ce00 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65  IRTUAL );.    }e
1ce10 6c 73 65 20 69 66 28 20 62 53 74 6f 70 41 74 4e  lse if( bStopAtN
1ce20 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ull ){.      sql
1ce30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ce40 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
1ce50 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
1ce60 20 20 65 6e 64 45 71 20 3d 20 30 3b 0a 20 20 20    endEq = 0;.   
1ce70 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
1ce80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1ce90 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
1cea0 74 61 72 74 41 66 66 29 3b 0a 0a 20 20 20 20 2f  tartAff);..    /
1ceb0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
1cec0 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c  p body */.    pL
1ced0 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74  evel->p2 = sqlit
1cee0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1cef0 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  r(v);..    /* Ch
1cf00 65 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78  eck if the index
1cf10 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 20   cursor is past 
1cf20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
1cf30 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ange. */.    if(
1cf40 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a   nConstraint ){.
1cf50 20 20 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f        op = aEndO
1cf60 70 5b 62 52 65 76 2a 32 20 2b 20 65 6e 64 45 71  p[bRev*2 + endEq
1cf70 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
1cf80 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
1cf90 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64   op, iIdxCur, ad
1cfa0 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20  drNxt, regBase, 
1cfb0 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
1cfc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1cfd0 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 20 20 56  ==OP_IdxGT );  V
1cfe0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1cff0 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b   op==OP_IdxGT );
1d000 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d010 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b   op==OP_IdxGE );
1d020 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1d030 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45  (v, op==OP_IdxGE
1d040 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1d050 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54  se( op==OP_IdxLT
1d060 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67   );  VdbeCoverag
1d070 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64  eIf(v, op==OP_Id
1d080 78 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  xLT );.      tes
1d090 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
1d0a0 78 4c 45 20 29 3b 20 20 56 64 62 65 43 6f 76 65  xLE );  VdbeCove
1d0b0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
1d0c0 5f 49 64 78 4c 45 20 29 3b 0a 20 20 20 20 7d 0a  _IdxLE );.    }.
1d0d0 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
1d0e0 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69   table cursor, i
1d0f0 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
1d100 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1d110 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72  evel, pRangeStar
1d120 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54  t);.    disableT
1d130 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e  erm(pLevel, pRan
1d140 67 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20  geEnd);.    if( 
1d150 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20  omitTable ){.   
1d160 20 20 20 2f 2a 20 70 49 64 78 20 69 73 20 61 20     /* pIdx is a 
1d170 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20  covering index. 
1d180 20 4e 6f 20 6e 65 65 64 20 74 6f 20 61 63 63 65   No need to acce
1d190 73 73 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  ss the main tabl
1d1a0 65 2e 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20  e. */.    }else 
1d1b0 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 49 64  if( HasRowid(pId
1d1c0 78 2d 3e 70 54 61 62 6c 65 29 20 29 7b 0a 20 20  x->pTable) ){.  
1d1d0 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
1d1e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1d1f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d200 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
1d210 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c  xRowid, iIdxCur,
1d220 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1d230 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1d240 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
1d250 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
1d260 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
1d270 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d280 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c  , OP_Seek, iCur,
1d290 20 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a   iRowidReg);  /*
1d2a0 20 44 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a   Deferred seek *
1d2b0 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  /.    }else if( 
1d2c0 69 43 75 72 21 3d 69 49 64 78 43 75 72 20 29 7b  iCur!=iIdxCur ){
1d2d0 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50  .      Index *pP
1d2e0 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
1d2f0 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 2d  ryKeyIndex(pIdx-
1d300 3e 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  >pTable);.      
1d310 69 52 6f 77 69 64 52 65 67 20 3d 20 73 71 6c 69  iRowidReg = sqli
1d320 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
1d330 70 50 61 72 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65  pParse, pPk->nKe
1d340 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72  yCol);.      for
1d350 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65  (j=0; j<pPk->nKe
1d360 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  yCol; j++){.    
1d370 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 43      k = sqlite3C
1d380 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64  olumnOfIndex(pId
1d390 78 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  x, pPk->aiColumn
1d3a0 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [j]);.        sq
1d3b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1d3c0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49  v, OP_Column, iI
1d3d0 64 78 43 75 72 2c 20 6b 2c 20 69 52 6f 77 69 64  dxCur, k, iRowid
1d3e0 52 65 67 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a  Reg+j);.      }.
1d3f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d400 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
1d410 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 43 75 72 2c  _NotFound, iCur,
1d420 20 61 64 64 72 43 6f 6e 74 2c 0a 20 20 20 20 20   addrCont,.     
1d430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d440 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 2c        iRowidReg,
1d450 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20   pPk->nKeyCol); 
1d460 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1d470 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1d480 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75  ecord the instru
1d490 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65  ction used to te
1d4a0 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
1d4b0 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a  . Disable .    *
1d4c0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
1d4d0 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64  erms made redund
1d4e0 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65 78  ant by the index
1d4f0 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20   range scan..   
1d500 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   */.    if( pLoo
1d510 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1d520 52 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20  RE_ONEROW ){.   
1d530 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1d540 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c  OP_Noop;.    }el
1d550 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20  se if( bRev ){. 
1d560 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
1d570 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d  = OP_Prev;.    }
1d580 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
1d590 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74  el->op = OP_Next
1d5a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  ;.    }.    pLev
1d5b0 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72  el->p1 = iIdxCur
1d5c0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 33  ;.    pLevel->p3
1d5d0 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61   = (pLoop->wsFla
1d5e0 67 73 26 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e  gs&WHERE_UNQ_WAN
1d5f0 54 45 44 29 21 3d 30 20 3f 20 31 3a 30 3b 0a 20  TED)!=0 ? 1:0;. 
1d600 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
1d610 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
1d620 4f 4e 53 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b  ONSTRAINT)==0 ){
1d630 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
1d640 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
1d650 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
1d660 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  TEP;.    }else{.
1d670 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
1d680 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
1d690 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69     }.  }else..#i
1d6a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d6b0 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
1d6c0 4e 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  N.  if( pLoop->w
1d6d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
1d6e0 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f  ULTI_OR ){.    /
1d6f0 2a 20 43 61 73 65 20 35 3a 20 20 54 77 6f 20 6f  * Case 5:  Two o
1d700 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c  r more separatel
1d710 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20  y indexed terms 
1d720 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a  connected by OR.
1d730 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
1d740 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1d750 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
1d760 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b  BLE t1(a,b,c,d);
1d770 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
1d780 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
1d790 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  a);.    **   CRE
1d7a0 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20  ATE INDEX i2 ON 
1d7b0 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20  t1(b);.    **   
1d7c0 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20  CREATE INDEX i3 
1d7d0 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a  ON t1(c);.    **
1d7e0 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
1d7f0 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
1d800 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28   a=5 OR b=7 OR (
1d810 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20  c=11 AND d=13). 
1d820 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20     **.    ** In 
1d830 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  the example, the
1d840 72 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64  re are three ind
1d850 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65  exed terms conne
1d860 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20  cted by OR..    
1d870 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68  ** The top of th
1d880 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b  e loop looks lik
1d890 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
1d8a0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
1d8b0 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
1d8c0 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
1d8d0 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
1d8e0 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20  reg 1.    **.   
1d8f0 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61   ** Then, for ea
1d900 63 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c  ch indexed term,
1d910 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20   the following. 
1d920 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  The arguments to
1d930 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65  .    ** RowSetTe
1d940 73 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74  st are such that
1d950 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
1d960 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
1d970 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a   inserted.    **
1d980 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74   into the RowSet
1d990 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
1d9a0 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74  dy present, cont
1d9b0 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20  rol skips the.  
1d9c0 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64    ** Gosub opcod
1d9d0 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61  e and jumps stra
1d9e0 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65  ight to the code
1d9f0 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68   generated by Wh
1da00 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a  ereEnd()..    **
1da10 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73  .    **        s
1da20 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1da30 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20  (<term>).    ** 
1da40 20 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54           RowSetT
1da50 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  est             
1da60 20 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f       # Insert ro
1da70 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a  wid into rowset.
1da80 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1da90 47 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20  Gosub      2 A. 
1daa0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
1dab0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20  ite3WhereEnd(). 
1dac0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c     **.    ** Fol
1dad0 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65  lowing the above
1dae0 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e  , code to termin
1daf0 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61  ate the loop. La
1db00 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65  bel A, the targe
1db10 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
1db20 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d  Gosub above, jum
1db30 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75  ps to the instru
1db40 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65  ction right afte
1db50 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20  r the Goto..    
1db60 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1db70 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
1db80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1db90 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
1dba0 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
1dbb0 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20            Goto  
1dbc0 20 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20       B          
1dbd0 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70        # The loop
1dbe0 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20   is finished..  
1dbf0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1dc00 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e    A: <loop body>
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc20 20 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20   # Return data, 
1dc30 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a  whatever..    **
1dc40 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1dc50 20 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20   Return     2   
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a               # J
1dc70 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1dc80 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20  Gosub.    **.   
1dc90 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66   **       B: <af
1dca0 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20  ter the loop>.  
1dcb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 64 64 65    **.    ** Adde
1dcc0 64 20 32 30 31 34 2d 30 35 2d 32 36 3a 20 49 66  d 2014-05-26: If
1dcd0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20   the table is a 
1dce0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
1dcf0 62 6c 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ble, then.    **
1dd00 20 75 73 65 20 61 6e 20 65 70 68 65 72 6d 65 72   use an ephermer
1dd10 61 6c 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64  al index instead
1dd20 20 6f 66 20 61 20 52 6f 77 53 65 74 20 74 6f 20   of a RowSet to 
1dd30 72 65 63 6f 72 64 20 74 68 65 20 70 72 69 6d 61  record the prima
1dd40 72 79 0a 20 20 20 20 2a 2a 20 6b 65 79 73 20 6f  ry.    ** keys o
1dd50 66 20 74 68 65 20 72 6f 77 73 20 77 65 20 68 61  f the rows we ha
1dd60 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 2e  ve already seen.
1dd70 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20  .    **.    */. 
1dd80 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
1dd90 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65  pOrWc;    /* The
1dda0 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65   OR-clause broke
1ddb0 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65  n out into subte
1ddc0 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69  rms */.    SrcLi
1ddd0 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20  st *pOrTab;     
1dde0 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74    /* Shortened t
1ddf0 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d  able list or OR-
1de00 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f  clause generatio
1de10 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  n */.    Index *
1de20 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20 20 20  pCov = 0;       
1de30 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69        /* Potenti
1de40 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  al covering inde
1de50 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  x (or NULL) */. 
1de60 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72 20 3d     int iCovCur =
1de70 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
1de80 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64    /* Cursor used
1de90 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61 6e 73   for index scans
1dea0 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20   (if any) */..  
1deb0 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 20    int regReturn 
1dec0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1ded0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
1dee0 65 67 69 73 74 65 72 20 75 73 65 64 20 77 69 74  egister used wit
1def0 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20  h OP_Gosub */.  
1df00 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65 74 20    int regRowset 
1df10 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1df20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1df30 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f 77 53  egister for RowS
1df40 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  et object */.   
1df50 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20   int regRowid = 
1df60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1df70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1df80 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
1df90 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  owid */.    int 
1dfa0 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69  iLoopBody = sqli
1dfb0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1dfc0 28 76 29 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f  (v);  /* Start o
1dfd0 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20  f loop body */. 
1dfe0 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69 74 3b     int iRetInit;
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e010 41 64 64 72 65 73 73 20 6f 66 20 72 65 67 52 65  Address of regRe
1e020 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20  turn init */.   
1e030 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54 65 72   int untestedTer
1e040 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ms = 0;         
1e050 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d      /* Some term
1e060 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  s not completely
1e070 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 69   tested */.    i
1e080 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0a0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1e0b0 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  r */.    Expr *p
1e0c0 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20 20  AndExpr = 0;    
1e0d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1e0e0 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22  n ".. AND (...)"
1e0f0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
1e100 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
1e110 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
1e120 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d  .   .    pTerm =
1e130 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30   pLoop->aLTerm[0
1e140 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
1e150 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61  Term!=0 );.    a
1e160 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
1e170 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20  perator & WO_OR 
1e180 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
1e190 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1e1a0 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30   TERM_ORINFO)!=0
1e1b0 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20   );.    pOrWc = 
1e1c0 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
1e1d0 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65  o->wc;.    pLeve
1e1e0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72  l->op = OP_Retur
1e1f0 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  n;.    pLevel->p
1e200 31 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a  1 = regReturn;..
1e210 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20      /* Set up a 
1e220 6e 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70  new SrcList in p
1e230 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67  OrTab containing
1e240 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
1e250 20 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20   scanned.    ** 
1e260 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20  by this loop in 
1e270 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e  the a[0] slot an
1e280 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74  d all notReady t
1e290 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20  ables in a[1..] 
1e2a0 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68  slots..    ** Th
1e2b0 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53  is becomes the S
1e2c0 72 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65  rcList in the re
1e2d0 63 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20  cursive call to 
1e2e0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1e2f0 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  n()..    */.    
1e300 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
1e310 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  el>1 ){.      in
1e320 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20  t nNotReady;    
1e330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e340 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f  The number of no
1e350 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f  tReady tables */
1e360 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
1e370 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67  cList_item *orig
1e380 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  Src;     /* Orig
1e390 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62  inal list of tab
1e3a0 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f  les */.      nNo
1e3b0 74 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d  tReady = pWInfo-
1e3c0 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c  >nLevel - iLevel
1e3d0 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54   - 1;.      pOrT
1e3e0 61 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63  ab = sqlite3Stac
1e3f0 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20 20  kAllocRaw(db,.  
1e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e410 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
1e420 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52  (*pOrTab)+ nNotR
1e430 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54  eady*sizeof(pOrT
1e440 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  ab->a[0]));.    
1e450 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20    if( pOrTab==0 
1e460 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64  ) return notRead
1e470 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d  y;.      pOrTab-
1e480 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e  >nAlloc = (u8)(n
1e490 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20  NotReady + 1);. 
1e4a0 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72       pOrTab->nSr
1e4b0 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c  c = pOrTab->nAll
1e4c0 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  oc;.      memcpy
1e4d0 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62  (pOrTab->a, pTab
1e4e0 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54  Item, sizeof(*pT
1e4f0 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20  abItem));.      
1e500 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f  origSrc = pWInfo
1e510 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  ->pTabList->a;. 
1e520 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
1e530 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29  =nNotReady; k++)
1e540 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
1e550 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20  (&pOrTab->a[k], 
1e560 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b  &origSrc[pLevel[
1e570 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f  k].iFrom], sizeo
1e580 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29  f(pOrTab->a[k]))
1e590 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1e5a0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61  lse{.      pOrTa
1e5b0 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  b = pWInfo->pTab
1e5c0 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  List;.    }..   
1e5d0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1e5e0 68 65 20 72 6f 77 73 65 74 20 72 65 67 69 73 74  he rowset regist
1e5f0 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55  er to contain NU
1e600 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20  LL. An SQL NULL 
1e610 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76  is .    ** equiv
1e620 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74  alent to an empt
1e630 79 20 72 6f 77 73 65 74 2e 20 20 4f 72 2c 20 63  y rowset.  Or, c
1e640 72 65 61 74 65 20 61 6e 20 65 70 68 65 72 6d 65  reate an epherme
1e650 72 61 6c 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  ral index.    **
1e660 20 63 61 70 61 62 6c 65 20 6f 66 20 68 6f 6c 64   capable of hold
1e670 69 6e 67 20 70 72 69 6d 61 72 79 20 6b 65 79 73  ing primary keys
1e680 20 69 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20   in the case of 
1e690 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e  a WITHOUT ROWID.
1e6a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
1e6b0 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72  lso initialize r
1e6c0 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74  egReturn to cont
1e6d0 61 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  ain the address 
1e6e0 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  of the instructi
1e6f0 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64  on .    ** immed
1e700 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
1e710 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61   the OP_Return a
1e720 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  t the bottom of 
1e730 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20  the loop. This. 
1e740 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
1e750 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75  d in a few obscu
1e760 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73  re LEFT JOIN cas
1e770 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c  es where control
1e780 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76   jumps.    ** ov
1e790 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  er the top of th
1e7a0 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20  e loop into the 
1e7b0 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74  body of it. In t
1e7c0 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20  his case the .  
1e7d0 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73    ** correct res
1e7e0 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e  ponse for the en
1e7f0 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28  d-of-loop code (
1e800 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69  the OP_Return) i
1e810 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c  s to .    ** fal
1e820 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
1e830 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
1e840 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50  n, just as an OP
1e850 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20  _Next does if.  
1e860 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61    ** called on a
1e870 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  n uninitialized 
1e880 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  cursor..    */. 
1e890 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
1e8a0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1e8b0 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b  RE_DUPLICATES_OK
1e8c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
1e8d0 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
1e8e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 67 52   ){.        regR
1e8f0 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  owset = ++pParse
1e900 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
1e910 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e920 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1e930 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20   regRowset);.   
1e940 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e950 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73    Index *pPk = s
1e960 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
1e970 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
1e980 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d       regRowset =
1e990 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
1e9a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e9b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e9c0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
1e9d0 72 65 67 52 6f 77 73 65 74 2c 20 70 50 6b 2d 3e  regRowset, pPk->
1e9e0 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20  nKeyCol);.      
1e9f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
1ea00 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  P4KeyInfo(pParse
1ea10 2c 20 70 50 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  , pPk);.      }.
1ea20 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d        regRowid =
1ea30 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1ea40 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49  .    }.    iRetI
1ea50 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nit = sqlite3Vdb
1ea60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1ea70 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74  teger, 0, regRet
1ea80 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  urn);..    /* If
1ea90 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48   the original WH
1eaa0 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a 20  ERE clause is z 
1eab0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28 78  of the form:  (x
1eac0 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20  1 OR x2 OR ...) 
1ead0 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68 65  AND y.    ** The
1eae0 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d  n for every term
1eaf0 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61 73   xN, evaluate as
1eb00 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
1eb10 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20  on: xN AND z.   
1eb20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74 65   ** That way, te
1eb30 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61 72  rms in y that ar
1eb40 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20  e factored into 
1eb50 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20  the disjunction 
1eb60 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70  will.    ** be p
1eb70 69 63 6b 65 64 20 75 70 20 62 79 20 74 68 65 20  icked up by the 
1eb80 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20  recursive calls 
1eb90 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
1eba0 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20  egin() below..  
1ebb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75    **.    ** Actu
1ebc0 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65 78  ally, each subex
1ebd0 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76  pression is conv
1ebe0 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e 44  erted to "xN AND
1ebf0 20 77 22 20 77 68 65 72 65 20 77 20 69 73 0a 20   w" where w is. 
1ec00 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65 72     ** the "inter
1ec10 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f 66  esting" terms of
1ec20 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74 20   z - terms that 
1ec30 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74  did not originat
1ec40 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e in the.    ** 
1ec50 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
1ec60 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
1ec70 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68 61  N, and terms tha
1ec80 74 20 61 72 65 20 75 73 61 62 6c 65 20 61 73 20  t are usable as 
1ec90 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  .    ** indices.
1eca0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1ecb0 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
1ecc0 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c 69   also only appli
1ecd0 65 73 20 69 66 20 74 68 65 20 28 78 31 20 4f 52  es if the (x1 OR
1ece0 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72 6d   x2 OR ...) term
1ecf0 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63  .    ** is not c
1ed00 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
1ed10 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c  ON clause of a L
1ed20 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a  EFT JOIN..    **
1ed30 20 53 65 65 20 74 69 63 6b 65 74 20 68 74 74 70   See ticket http
1ed40 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
1ed50 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36 39  g/src/info/f2369
1ed60 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20 20  304e4.    */.   
1ed70 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e   if( pWC->nTerm>
1ed80 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  1 ){.      int i
1ed90 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Term;.      for(
1eda0 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70  iTerm=0; iTerm<p
1edb0 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d  WC->nTerm; iTerm
1edc0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  ++){.        Exp
1edd0 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e  r *pExpr = pWC->
1ede0 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a  a[iTerm].pExpr;.
1edf0 20 20 20 20 20 20 20 20 69 66 28 20 26 70 57 43          if( &pWC
1ee00 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d 20 70 54  ->a[iTerm] == pT
1ee10 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  erm ) continue;.
1ee20 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72          if( Expr
1ee30 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1ee40 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
1ee50 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1ee60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57      testcase( pW
1ee70 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c  C->a[iTerm].wtFl
1ee80 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46  ags & TERM_ORINF
1ee90 4f 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  O );.        tes
1eea0 74 63 61 73 65 28 20 70 57 43 2d 3e 61 5b 69 54  tcase( pWC->a[iT
1eeb0 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 54  erm].wtFlags & T
1eec0 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
1eed0 20 20 20 20 20 20 20 69 66 28 20 70 57 43 2d 3e         if( pWC->
1eee0 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73  a[iTerm].wtFlags
1eef0 20 26 20 28 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c   & (TERM_ORINFO|
1ef00 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 20  TERM_VIRTUAL) ) 
1ef10 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1ef20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54    if( (pWC->a[iT
1ef30 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20 26  erm].eOperator &
1ef40 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63 6f   WO_ALL)==0 ) co
1ef50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1ef60 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
1ef70 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
1ef80 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 41  , 0);.        pA
1ef90 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ndExpr = sqlite3
1efa0 45 78 70 72 41 6e 64 28 64 62 2c 20 70 41 6e 64  ExprAnd(db, pAnd
1efb0 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20  Expr, pExpr);.  
1efc0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1efd0 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20  pAndExpr ){.    
1efe0 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73      pAndExpr = s
1eff0 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1f000 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 70  se, TK_AND, 0, p
1f010 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  AndExpr, 0);.   
1f020 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1f030 2f 2a 20 52 75 6e 20 61 20 73 65 70 61 72 61 74  /* Run a separat
1f040 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
1f050 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20  or each term of 
1f060 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 20 20  the OR clause.  
1f070 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 65 6c 69  After.    ** eli
1f080 6d 69 6e 61 74 69 6e 67 20 64 75 70 6c 69 63 61  minating duplica
1f090 74 65 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 57  tes from other W
1f0a0 48 45 52 45 20 63 6c 61 75 73 65 73 2c 20 74 68  HERE clauses, th
1f0b0 65 20 61 63 74 69 6f 6e 20 66 6f 72 20 65 61 63  e action for eac
1f0c0 68 0a 20 20 20 20 2a 2a 20 73 75 62 2d 57 48 45  h.    ** sub-WHE
1f0d0 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20  RE clause is to 
1f0e0 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 6d 61  to invoke the ma
1f0f0 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 61 73 20  in loop body as 
1f100 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 0a 20 20  a subroutine..  
1f110 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d    */.    for(ii=
1f120 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65  0; ii<pOrWc->nTe
1f130 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  rm; ii++){.     
1f140 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
1f150 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b  erm = &pOrWc->a[
1f160 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ii];.      if( p
1f170 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
1f180 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72  or==iCur || (pOr
1f190 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1f1a0 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a  & WO_AND)!=0 ){.
1f1b0 20 20 20 20 20 20 20 20 57 68 65 72 65 49 6e 66          WhereInf
1f1c0 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20  o *pSubWInfo;   
1f1d0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20          /* Info 
1f1e0 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65  for single OR-te
1f1f0 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  rm scan */.     
1f200 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78 70 72     Expr *pOrExpr
1f210 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70   = pOrTerm->pExp
1f220 72 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 4f 52  r; /* Current OR
1f230 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
1f240 20 20 20 20 20 20 20 20 69 6e 74 20 6a 31 20 3d          int j1 =
1f250 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f260 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1f270 73 73 20 6f 66 20 6a 75 6d 70 20 6f 70 65 72 61  ss of jump opera
1f280 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
1f290 69 66 28 20 70 41 6e 64 45 78 70 72 20 26 26 20  if( pAndExpr && 
1f2a0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1f2b0 28 70 4f 72 45 78 70 72 2c 20 45 50 5f 46 72 6f  (pOrExpr, EP_Fro
1f2c0 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
1f2d0 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c      pAndExpr->pL
1f2e0 65 66 74 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20  eft = pOrExpr;. 
1f2f0 20 20 20 20 20 20 20 20 20 70 4f 72 45 78 70 72           pOrExpr
1f300 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20 20 20   = pAndExpr;.   
1f310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
1f320 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  * Loop through t
1f330 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61  able entries tha
1f340 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72  t match term pOr
1f350 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20  Term. */.       
1f360 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c   pSubWInfo = sql
1f370 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
1f380 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70  Parse, pOrTab, p
1f390 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20  OrExpr, 0, 0,.  
1f3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3b0 20 20 20 20 20 20 57 48 45 52 45 5f 4f 4d 49 54        WHERE_OMIT
1f3c0 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c 20 57 48  _OPEN_CLOSE | WH
1f3d0 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20  ERE_AND_ONLY |. 
1f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3f0 20 20 20 20 20 20 20 57 48 45 52 45 5f 46 4f 52         WHERE_FOR
1f400 43 45 5f 54 41 42 4c 45 20 7c 20 57 48 45 52 45  CE_TABLE | WHERE
1f410 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20  _ONETABLE_ONLY, 
1f420 69 43 6f 76 43 75 72 29 3b 0a 20 20 20 20 20 20  iCovCur);.      
1f430 20 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49    assert( pSubWI
1f440 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  nfo || pParse->n
1f450 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
1f460 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
1f470 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
1f480 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68   ){.          Wh
1f490 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f  ereLoop *pSubLoo
1f4a0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  p;.          exp
1f4b0 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20  lainOneScan(.   
1f4c0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
1f4d0 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62  e, pOrTab, &pSub
1f4e0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65  WInfo->a[0], iLe
1f4f0 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72  vel, pLevel->iFr
1f500 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20  om, 0.          
1f510 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
1f520 54 68 69 73 20 69 73 20 74 68 65 20 73 75 62 2d  This is the sub-
1f530 57 48 45 52 45 20 63 6c 61 75 73 65 20 62 6f 64  WHERE clause bod
1f540 79 2e 20 20 46 69 72 73 74 20 73 6b 69 70 20 6f  y.  First skip o
1f550 76 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ver.          **
1f560 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20   duplicate rows 
1f570 66 72 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d 57  from prior sub-W
1f580 48 45 52 45 20 63 6c 61 75 73 65 73 2c 20 61 6e  HERE clauses, an
1f590 64 20 72 65 63 6f 72 64 20 74 68 65 0a 20 20 20  d record the.   
1f5a0 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20         ** rowid 
1f5b0 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 29  (or PRIMARY KEY)
1f5c0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
1f5d0 20 72 6f 77 20 73 6f 20 74 68 61 74 20 74 68 65   row so that the
1f5e0 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20   same.          
1f5f0 2a 2a 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 73  ** row will be s
1f600 6b 69 70 70 65 64 20 69 6e 20 73 75 62 73 65 71  kipped in subseq
1f610 75 65 6e 74 20 73 75 62 2d 57 48 45 52 45 20 63  uent sub-WHERE c
1f620 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20  lauses..        
1f630 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
1f640 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
1f650 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
1f660 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30  UPLICATES_OK)==0
1f670 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f680 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20  int r;.         
1f690 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28     int iSet = ((
1f6a0 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  ii==pOrWc->nTerm
1f6b0 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20  -1)?-1:ii);.    
1f6c0 20 20 20 20 20 20 20 20 69 66 28 20 48 61 73 52          if( HasR
1f6d0 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20              r = 
1f6f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1f700 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
1f710 20 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c   pTab, -1, iCur,
1f720 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20   regRowid, 0);. 
1f730 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 31 20               j1 
1f740 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1f750 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77  Op4Int(v, OP_Row
1f760 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77 73  SetTest, regRows
1f770 65 74 2c 20 30 2c 20 72 2c 69 53 65 74 29 3b 0a  et, 0, r,iSet);.
1f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
1f790 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1f7a0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1f7b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1f7c0 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
1f7d0 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
1f7e0 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
1f7f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6b           int nPk
1f800 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   = pPk->nKeyCol;
1f810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1f820 6e 74 20 69 50 6b 3b 0a 0a 20 20 20 20 20 20 20  nt iPk;..       
1f830 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
1f840 68 65 20 50 4b 20 69 6e 74 6f 20 61 6e 20 61 72  he PK into an ar
1f850 72 61 79 20 6f 66 20 74 65 6d 70 20 72 65 67 69  ray of temp regi
1f860 73 74 65 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20  sters. */.      
1f870 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69          r = sqli
1f880 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
1f890 70 50 61 72 73 65 2c 20 6e 50 6b 29 3b 0a 20 20  pParse, nPk);.  
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
1f8b0 69 50 6b 3d 30 3b 20 69 50 6b 3c 6e 50 6b 3b 20  iPk=0; iPk<nPk; 
1f8c0 69 50 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  iPk++){.        
1f8d0 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
1f8e0 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
1f8f0 5b 69 50 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20  [iPk];.         
1f900 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1f910 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1f920 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43  pParse, pTab, iC
1f930 6f 6c 2c 20 69 43 75 72 2c 20 72 2b 69 50 6b 2c  ol, iCur, r+iPk,
1f940 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
1f950 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
1f960 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
1f970 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 61  the temp table a
1f980 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20  lready contains 
1f990 74 68 69 73 20 6b 65 79 2e 20 49 66 20 73 6f 2c  this key. If so,
1f9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
1f9b0 2a 20 74 68 65 20 72 6f 77 20 68 61 73 20 61 6c  * the row has al
1f9c0 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 6c 75  ready been inclu
1f9d0 64 65 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ded in the resul
1f9e0 74 20 73 65 74 20 61 6e 64 0a 20 20 20 20 20 20  t set and.      
1f9f0 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62          ** can b
1fa00 65 20 69 67 6e 6f 72 65 64 20 28 62 79 20 6a 75  e ignored (by ju
1fa10 6d 70 69 6e 67 20 70 61 73 74 20 74 68 65 20 47  mping past the G
1fa20 6f 73 75 62 20 62 65 6c 6f 77 29 2e 20 4f 74 68  osub below). Oth
1fa30 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 20 20  erwise,.        
1fa40 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20        ** insert 
1fa50 74 68 65 20 6b 65 79 20 69 6e 74 6f 20 74 68 65  the key into the
1fa60 20 74 65 6d 70 20 74 61 62 6c 65 20 61 6e 64 20   temp table and 
1fa70 70 72 6f 63 65 65 64 20 77 69 74 68 20 70 72 6f  proceed with pro
1fa80 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 20 20  cessing.        
1fa90 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 6f 77        ** the row
1faa0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1fab0 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  **.             
1fac0 20 2a 2a 20 55 73 65 20 73 6f 6d 65 20 6f 66 20   ** Use some of 
1fad0 74 68 65 20 73 61 6d 65 20 6f 70 74 69 6d 69 7a  the same optimiz
1fae0 61 74 69 6f 6e 73 20 61 73 20 4f 50 5f 52 6f 77  ations as OP_Row
1faf0 53 65 74 54 65 73 74 3a 20 49 66 20 69 53 65 74  SetTest: If iSet
1fb00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
1fb10 2a 20 69 73 20 7a 65 72 6f 2c 20 61 73 73 75 6d  * is zero, assum
1fb20 65 20 74 68 61 74 20 74 68 65 20 6b 65 79 20 63  e that the key c
1fb30 61 6e 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  annot already be
1fb40 20 70 72 65 73 65 6e 74 20 69 6e 0a 20 20 20 20   present in.    
1fb50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
1fb60 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 41 6e 64   temp table. And
1fb70 20 69 66 20 69 53 65 74 20 69 73 20 2d 31 2c 20   if iSet is -1, 
1fb80 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 72  assume that ther
1fb90 65 20 69 73 20 6e 6f 20 0a 20 20 20 20 20 20 20  e is no .       
1fba0 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74         ** need t
1fbb0 6f 20 69 6e 73 65 72 74 20 74 68 65 20 6b 65 79  o insert the key
1fbc0 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
1fbd0 61 62 6c 65 2c 20 61 73 20 69 74 20 77 69 6c 6c  able, as it will
1fbe0 20 6e 65 76 65 72 20 0a 20 20 20 20 20 20 20 20   never .        
1fbf0 20 20 20 20 20 20 2a 2a 20 62 65 20 74 65 73 74        ** be test
1fc00 65 64 20 66 6f 72 2e 20 20 2a 2f 20 0a 20 20 20  ed for.  */ .   
1fc10 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
1fc20 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Set ){.         
1fc30 20 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69         j1 = sqli
1fc40 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1fc50 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 72 65  (v, OP_Found, re
1fc60 67 52 6f 77 73 65 74 2c 20 30 2c 20 72 2c 20 6e  gRowset, 0, r, n
1fc70 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pk);.           
1fc80 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1fc90 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
1fca0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1fcb0 20 20 20 20 69 66 28 20 69 53 65 74 3e 3d 30 20      if( iSet>=0 
1fcc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1fcd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1fce0 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
1fcf0 65 63 6f 72 64 2c 20 72 2c 20 6e 50 6b 2c 20 72  ecord, r, nPk, r
1fd00 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
1fd10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1fd20 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1fd30 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 72 65 67  P_IdxInsert, reg
1fd40 52 6f 77 73 65 74 2c 20 72 65 67 52 6f 77 69 64  Rowset, regRowid
1fd50 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1fd60 20 20 20 20 20 20 69 66 28 20 69 53 65 74 20 29        if( iSet )
1fd70 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1fd80 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55  geP5(v, OPFLAG_U
1fd90 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20  SESEEKRESULT);. 
1fda0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a               }..
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fdc0 20 52 65 6c 65 61 73 65 20 74 68 65 20 61 72 72   Release the arr
1fdd0 61 79 20 6f 66 20 74 65 6d 70 20 72 65 67 69 73  ay of temp regis
1fde0 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ters */.        
1fdf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1fe00 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
1fe10 61 72 73 65 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20  arse, r, nPk);. 
1fe20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1fe30 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1fe40 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68      /* Invoke th
1fe50 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79  e main loop body
1fe60 20 61 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65   as a subroutine
1fe70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
1fe80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1fe90 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1fea0 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64  Return, iLoopBod
1feb0 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  y);..          /
1fec0 2a 20 4a 75 6d 70 20 68 65 72 65 20 28 73 6b 69  * Jump here (ski
1fed0 70 70 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 6c  pping the main l
1fee0 6f 6f 70 20 62 6f 64 79 20 73 75 62 72 6f 75 74  oop body subrout
1fef0 69 6e 65 29 20 69 66 20 74 68 65 0a 20 20 20 20  ine) if the.    
1ff00 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
1ff10 20 73 75 62 2d 57 48 45 52 45 20 72 6f 77 20 69   sub-WHERE row i
1ff20 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 66 72  s a duplicate fr
1ff30 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d 57 48 45  om prior sub-WHE
1ff40 52 45 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  REs. */.        
1ff50 20 20 69 66 28 20 6a 31 20 29 20 73 71 6c 69 74    if( j1 ) sqlit
1ff60 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1ff70 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 20 20 20 20  , j1);..        
1ff80 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e    /* The pSubWIn
1ff90 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
1ffa0 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61  s flag means tha
1ffb0 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20  t this OR term. 
1ffc0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74           ** cont
1ffd0 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  ained one or mor
1ffe0 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20  e AND term from 
1fff0 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  a notReady table
20000 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 20  .  The.         
20010 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74   ** terms from t
20020 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  he notReady tabl
20030 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74  e could not be t
20040 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20  ested and will. 
20050 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64           ** need
20060 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61   to be tested la
20070 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ter..          *
20080 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
20090 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
200a0 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73  tedTerms ) untes
200b0 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20  tedTerms = 1;.. 
200c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
200d0 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e  ll of the OR-con
200e0 6e 65 63 74 65 64 20 74 65 72 6d 73 20 61 72 65  nected terms are
200f0 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
20100 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
20110 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e      ** index, an
20120 64 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f  d the index is o
20130 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20  pened using the 
20140 73 61 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  same cursor numb
20150 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
20160 62 79 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20  by each call to 
20170 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
20180 6e 28 29 20 6d 61 64 65 20 62 79 20 74 68 69 73  n() made by this
20190 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20   loop, it may.  
201a0 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 70 6f          ** be po
201b0 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68  ssible to use th
201c0 61 74 20 69 6e 64 65 78 20 61 73 20 61 20 63 6f  at index as a co
201d0 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20  vering index..  
201e0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
201f0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 63       ** If the c
20200 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
20210 65 72 65 42 65 67 69 6e 28 29 20 61 62 6f 76 65  ereBegin() above
20220 20 72 65 73 75 6c 74 65 64 20 69 6e 20 61 20 73   resulted in a s
20230 63 61 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20  can that.       
20240 20 20 20 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e     ** uses an in
20250 64 65 78 2c 20 61 6e 64 20 74 68 69 73 20 69 73  dex, and this is
20260 20 65 69 74 68 65 72 20 74 68 65 20 66 69 72 73   either the firs
20270 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74  t OR-connected t
20280 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  erm.          **
20290 20 70 72 6f 63 65 73 73 65 64 20 6f 72 20 74 68   processed or th
202a0 65 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 73  e index is the s
202b0 61 6d 65 20 61 73 20 74 68 61 74 20 75 73 65 64  ame as that used
202c0 20 62 79 20 61 6c 6c 20 70 72 65 76 69 6f 75 73   by all previous
202d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
202e0 72 6d 73 2c 20 73 65 74 20 70 43 6f 76 20 74 6f  rms, set pCov to
202f0 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 63   the candidate c
20300 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f  overing index. O
20310 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 0a 20  therwise, set . 
20320 20 20 20 20 20 20 20 20 20 2a 2a 20 70 43 6f 76           ** pCov
20330 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69   to NULL to indi
20340 63 61 74 65 20 74 68 61 74 20 6e 6f 20 63 61 6e  cate that no can
20350 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20  didate covering 
20360 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20 20 20  index will .    
20370 20 20 20 20 20 20 2a 2a 20 62 65 20 61 76 61 69        ** be avai
20380 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 20  lable..         
20390 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 53   */.          pS
203a0 75 62 4c 6f 6f 70 20 3d 20 70 53 75 62 57 49 6e  ubLoop = pSubWIn
203b0 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b  fo->a[0].pWLoop;
203c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
203d0 74 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73  t( (pSubLoop->ws
203e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
203f0 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a  TO_INDEX)==0 );.
20400 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
20410 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  SubLoop->wsFlags
20420 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
20430 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
20440 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75  && (ii==0 || pSu
20450 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  bLoop->u.btree.p
20460 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20  Index==pCov).   
20470 20 20 20 20 20 20 20 20 26 26 20 28 48 61 73 52          && (HasR
20480 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49  owid(pTab) || !I
20490 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
204a0 28 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72  (pSubLoop->u.btr
204b0 65 65 2e 70 49 6e 64 65 78 29 29 0a 20 20 20 20  ee.pIndex)).    
204c0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
204d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
204e0 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64  bWInfo->a[0].iId
204f0 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b  xCur==iCovCur );
20500 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
20510 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e  v = pSubLoop->u.
20520 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
20530 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20540 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20             pCov 
20550 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
20560 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ..          /* F
20570 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74  inish the loop t
20580 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74  hrough table ent
20590 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20  ries that match 
205a0 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f  term pOrTerm. */
205b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
205c0 65 33 57 68 65 72 65 45 6e 64 28 70 53 75 62 57  e3WhereEnd(pSubW
205d0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d  Info);.        }
205e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
205f0 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f     pLevel->u.pCo
20600 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20  vidx = pCov;.   
20610 20 69 66 28 20 70 43 6f 76 20 29 20 70 4c 65 76   if( pCov ) pLev
20620 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 43  el->iIdxCur = iC
20630 6f 76 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70  ovCur;.    if( p
20640 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20  AndExpr ){.     
20650 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74   pAndExpr->pLeft
20660 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
20670 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
20680 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20  , pAndExpr);.   
20690 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
206a0 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52  beChangeP1(v, iR
206b0 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56  etInit, sqlite3V
206c0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
206d0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
206e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
206f0 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
20700 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73  >addrBrk);.    s
20710 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
20720 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42  eLabel(v, iLoopB
20730 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ody);..    if( p
20740 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20  WInfo->nLevel>1 
20750 29 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72  ) sqlite3StackFr
20760 65 65 28 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a  ee(db, pOrTab);.
20770 20 20 20 20 69 66 28 20 21 75 6e 74 65 73 74 65      if( !unteste
20780 64 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65  dTerms ) disable
20790 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
207a0 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  rm);.  }else.#en
207b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
207c0 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
207d0 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f  ON */..  {.    /
207e0 2a 20 43 61 73 65 20 36 3a 20 20 54 68 65 72 65  * Case 6:  There
207f0 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e   is no usable in
20800 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f  dex.  We must do
20810 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20   a complete.    
20820 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e  **          scan
20830 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
20840 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
20850 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
20860 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f   aStep[] = { OP_
20870 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b  Next, OP_Prev };
20880 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
20890 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20  t u8 aStart[] = 
208a0 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f  { OP_Rewind, OP_
208b0 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65  Last };.    asse
208c0 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62  rt( bRev==0 || b
208d0 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66  Rev==1 );.    if
208e0 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 73 52 65  ( pTabItem->isRe
208f0 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
20900 20 2f 2a 20 54 61 62 6c 65 73 20 6d 61 72 6b 65   /* Tables marke
20910 64 20 69 73 52 65 63 75 72 73 69 76 65 20 68 61  d isRecursive ha
20920 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ve only a single
20930 20 72 6f 77 20 74 68 61 74 20 69 73 20 73 74 6f   row that is sto
20940 72 65 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  red in.      ** 
20950 61 20 70 73 65 75 64 6f 2d 63 75 72 73 6f 72 2e  a pseudo-cursor.
20960 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 52 65 77    No need to Rew
20970 69 6e 64 20 6f 72 20 4e 65 78 74 20 73 75 63 68  ind or Next such
20980 20 63 75 72 73 6f 72 73 2e 20 2a 2f 0a 20 20 20   cursors. */.   
20990 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
209a0 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c  OP_Noop;.    }el
209b0 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
209c0 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65  ->op = aStep[bRe
209d0 76 5d 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  v];.      pLevel
209e0 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
209f0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
20a00 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
20a10 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b  ddOp2(v, aStart[
20a20 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64  bRev], iCur, add
20a30 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62  rBrk);.      Vdb
20a40 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
20a50 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56  Rev==0);.      V
20a60 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
20a70 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 20   bRev!=0);.     
20a80 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51   pLevel->p5 = SQ
20a90 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
20aa0 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20  FULLSCAN_STEP;. 
20ab0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
20ac0 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65  nsert code to te
20ad0 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72  st every subexpr
20ae0 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  ession that can 
20af0 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20  be completely.  
20b00 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e  ** computed usin
20b10 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  g the current se
20b20 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a  t of tables..  *
20b30 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  /.  for(pTerm=pW
20b40 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65  C->a, j=pWC->nTe
20b50 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54  rm; j>0; j--, pT
20b60 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  erm++){.    Expr
20b70 20 2a 70 45 3b 0a 20 20 20 20 74 65 73 74 63 61   *pE;.    testca
20b80 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
20b90 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
20ba0 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
20bb0 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
20bc0 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29  s & TERM_CODED )
20bd0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
20be0 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
20bf0 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
20c00 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
20c10 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
20c20 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65  >prereqAll & pLe
20c30 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d  vel->notReady)!=
20c40 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
20c50 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74  ase( pWInfo->unt
20c60 65 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20  estedTerms==0.  
20c70 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
20c80 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
20c90 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
20ca0 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b  ABLE_ONLY)!=0 );
20cb0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75  .      pWInfo->u
20cc0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31  ntestedTerms = 1
20cd0 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
20ce0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 20 3d  ;.    }.    pE =
20cf0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
20d00 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30     assert( pE!=0
20d10 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76   );.    if( pLev
20d20 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26  el->iLeftJoin &&
20d30 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
20d40 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
20d50 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74  n) ){.      cont
20d60 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
20d70 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
20d80 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c 20 61  se(pParse, pE, a
20d90 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
20da0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
20db0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
20dc0 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
20dd0 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20   }..  /* Insert 
20de0 63 6f 64 65 20 74 6f 20 74 65 73 74 20 66 6f 72  code to test for
20df0 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73 74 72 61   implied constra
20e00 69 6e 74 73 20 62 61 73 65 64 20 6f 6e 20 74 72  ints based on tr
20e10 61 6e 73 69 74 69 76 69 74 79 0a 20 20 2a 2a 20  ansitivity.  ** 
20e20 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f 70 65 72  of the "==" oper
20e30 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ator..  **.  ** 
20e40 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20  Example: If the 
20e50 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
20e60 74 61 69 6e 73 20 22 74 31 2e 61 3d 74 32 2e 62  tains "t1.a=t2.b
20e70 22 20 61 6e 64 20 22 74 32 2e 62 3d 31 32 33 22  " and "t2.b=123"
20e80 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  .  ** and we are
20e90 20 63 6f 64 69 6e 67 20 74 68 65 20 74 31 20 6c   coding the t1 l
20ea0 6f 6f 70 20 61 6e 64 20 74 68 65 20 74 32 20 6c  oop and the t2 l
20eb0 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79 65 74 20  oop has not yet 
20ec0 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e  coded,.  ** then
20ed0 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 74   we cannot use t
20ee0 68 65 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 63  he "t1.a=t2.b" c
20ef0 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75 74 20 77  onstraint, but w
20f00 65 20 63 61 6e 20 63 6f 64 65 0a 20 20 2a 2a 20  e can code.  ** 
20f10 74 68 65 20 69 6d 70 6c 69 65 64 20 22 74 31 2e  the implied "t1.
20f20 61 3d 31 32 33 22 20 63 6f 6e 73 74 72 61 69 6e  a=123" constrain
20f30 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54  t..  */.  for(pT
20f40 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57  erm=pWC->a, j=pW
20f50 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a  C->nTerm; j>0; j
20f60 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  --, pTerm++){.  
20f70 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 45 41    Expr *pE, *pEA
20f80 6c 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  lt;.    WhereTer
20f90 6d 20 2a 70 41 6c 74 3b 0a 20 20 20 20 69 66 28  m *pAlt;.    if(
20fa0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
20fb0 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
20fc0 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
20fd0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
20fe0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
20ff0 21 3d 28 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 45  !=(WO_EQUIV|WO_E
21000 51 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  Q) ) continue;. 
21010 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
21020 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29  ftCursor!=iCur )
21030 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
21040 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
21050 4a 6f 69 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Join ) continue;
21060 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d  .    pE = pTerm-
21070 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >pExpr;.    asse
21080 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
21090 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
210a0 4a 6f 69 6e 29 20 29 3b 0a 20 20 20 20 61 73 73  Join) );.    ass
210b0 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 70 72 65  ert( (pTerm->pre
210c0 72 65 71 52 69 67 68 74 20 26 20 70 4c 65 76 65  reqRight & pLeve
210d0 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20  l->notReady)!=0 
210e0 29 3b 0a 20 20 20 20 70 41 6c 74 20 3d 20 66 69  );.    pAlt = fi
210f0 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
21100 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  , pTerm->u.leftC
21110 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61 64 79 2c  olumn, notReady,
21120 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29   WO_EQ|WO_IN, 0)
21130 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74 3d 3d  ;.    if( pAlt==
21140 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
21150 20 20 69 66 28 20 70 41 6c 74 2d 3e 77 74 46 6c    if( pAlt->wtFl
21160 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 44 45  ags & (TERM_CODE
21170 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
21180 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 6c     testcase( pAl
21190 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
211a0 4f 5f 45 51 20 29 3b 0a 20 20 20 20 74 65 73 74  O_EQ );.    test
211b0 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65  case( pAlt->eOpe
211c0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b  rator & WO_IN );
211d0 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  .    VdbeModuleC
211e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
211f0 6e 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e  n transitive con
21200 73 74 72 61 69 6e 74 22 29 29 3b 0a 20 20 20 20  straint"));.    
21210 70 45 41 6c 74 20 3d 20 73 71 6c 69 74 65 33 53  pEAlt = sqlite3S
21220 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c  tackAllocRaw(db,
21230 20 73 69 7a 65 6f 66 28 2a 70 45 41 6c 74 29 29   sizeof(*pEAlt))
21240 3b 0a 20 20 20 20 69 66 28 20 70 45 41 6c 74 20  ;.    if( pEAlt 
21250 29 7b 0a 20 20 20 20 20 20 2a 70 45 41 6c 74 20  ){.      *pEAlt 
21260 3d 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a  = *pAlt->pExpr;.
21270 20 20 20 20 20 20 70 45 41 6c 74 2d 3e 70 4c 65        pEAlt->pLe
21280 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66 74 3b 0a  ft = pE->pLeft;.
21290 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
212a0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
212b0 20 70 45 41 6c 74 2c 20 61 64 64 72 43 6f 6e 74   pEAlt, addrCont
212c0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
212d0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
212e0 74 65 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c  te3StackFree(db,
212f0 20 70 45 41 6c 74 29 3b 0a 20 20 20 20 7d 0a 20   pEAlt);.    }. 
21300 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c   }..  /* For a L
21310 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
21320 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  generate code th
21330 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74  at will record t
21340 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a  he fact that.  *
21350 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72  * at least one r
21360 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  ow of the right 
21370 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65  table has matche
21380 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  d the left table
21390 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  .  .  */.  if( p
213a0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
213b0 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
213c0 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
213d0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
213e0 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
213f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21400 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70  OP_Integer, 1, p
21410 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
21420 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
21430 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c  nt((v, "record L
21440 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b  EFT JOIN hit"));
21450 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
21460 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
21470 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72  e);.    for(pTer
21480 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a  m=pWC->a, j=0; j
21490 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b  <pWC->nTerm; j++
214a0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
214b0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
214c0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
214d0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
214e0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
214f0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
21500 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20  RM_CODED );.    
21510 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
21520 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
21530 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
21540 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21550 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
21560 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65  rereqAll & pLeve
21570 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20  l->notReady)!=0 
21580 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
21590 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  t( pWInfo->untes
215a0 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20  tedTerms );.    
215b0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
215c0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
215d0 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
215e0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
215f0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
21600 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
21610 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  r, addrCont, SQL
21620 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
21630 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
21640 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
21650 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  DED;.    }.  }..
21660 20 20 72 65 74 75 72 6e 20 70 4c 65 76 65 6c 2d    return pLevel-
21670 3e 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69  >notReady;.}..#i
21680 66 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54  f defined(WHERET
21690 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 20 26 26  RACE_ENABLED) &&
216a0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
216b0 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
216c0 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  AIN)./*.** Gener
216d0 61 74 65 20 22 45 78 70 6c 61 6e 61 74 69 6f 6e  ate "Explanation
216e0 22 20 74 65 78 74 20 66 6f 72 20 61 20 57 68 65  " text for a Whe
216f0 72 65 54 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69  reTerm..*/.stati
21700 63 20 76 6f 69 64 20 77 68 65 72 65 45 78 70 6c  c void whereExpl
21710 61 69 6e 54 65 72 6d 28 56 64 62 65 20 2a 76 2c  ainTerm(Vdbe *v,
21720 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
21730 6d 29 7b 0a 20 20 63 68 61 72 20 7a 54 79 70 65  m){.  char zType
21740 5b 34 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 54  [4];.  memcpy(zT
21750 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a  ype, "...", 4);.
21760 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
21770 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
21780 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d  UAL ) zType[0] =
21790 20 27 56 27 3b 0a 20 20 69 66 28 20 70 54 65 72   'V';.  if( pTer
217a0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
217b0 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70 65  O_EQUIV  ) zType
217c0 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 69 66 28  [1] = 'E';.  if(
217d0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
217e0 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
217f0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54  P_FromJoin) ) zT
21800 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20 20  ype[2] = 'L';.  
21810 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
21820 69 6e 74 66 28 76 2c 20 22 25 73 20 22 2c 20 7a  intf(v, "%s ", z
21830 54 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Type);.  sqlite3
21840 45 78 70 6c 61 69 6e 45 78 70 72 28 76 2c 20 70  ExplainExpr(v, p
21850 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a  Term->pExpr);.}.
21860 23 65 6e 64 69 66 20 2f 2a 20 57 48 45 52 45 54  #endif /* WHERET
21870 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 26 26 20  RACE_ENABLED && 
21880 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52  SQLITE_ENABLE_TR
21890 45 45 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a  EE_EXPLAIN */...
218a0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
218b0 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20  E_ENABLED./*.** 
218c0 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c 6f 6f  Print a WhereLoo
218d0 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64 65 62  p object for deb
218e0 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73 0a  ugging purposes.
218f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
21900 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57 68  hereLoopPrint(Wh
21910 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72  ereLoop *p, Wher
21920 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20  eClause *pWC){. 
21930 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
21940 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  fo = pWC->pWInfo
21950 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28  ;.  int nb = 1+(
21960 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
21970 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20 20 73  ->nSrc+7)/8;.  s
21980 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
21990 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57 49 6e  em *pItem = pWIn
219a0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20  fo->pTabList->a 
219b0 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62  + p->iTab;.  Tab
219c0 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d  le *pTab = pItem
219d0 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65  ->pTab;.  sqlite
219e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 63  3DebugPrintf("%c
219f0 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c  %2d.%0*llx.%0*ll
21a00 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20  x", p->cId,.    
21a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d   p->iTab, nb, p-
21a30 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70  >maskSelf, nb, p
21a40 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73 71 6c  ->prereq);.  sql
21a50 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
21a60 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20 20 20  " %12s",.       
21a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
21a80 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49  tem->zAlias ? pI
21a90 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54  tem->zAlias : pT
21aa0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ab->zName);.  if
21ab0 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
21ac0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
21ad0 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 63  LE)==0 ){.     c
21ae0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
21af0 3b 0a 20 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  ;.     if( p->u.
21b00 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26 20  btree.pIndex && 
21b10 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74  (zName = p->u.bt
21b20 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
21b30 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)!=0 ){.      i
21b40 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65  f( strncmp(zName
21b50 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
21b60 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b  dex_", 17)==0 ){
21b70 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
21b80 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
21b90 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20  (zName) - 1;.   
21ba0 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d       while( zNam
21bb0 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b  e[i]!='_' ) i--;
21bc0 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b  .        zName +
21bd0 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = i;.      }.   
21be0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
21bf0 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32  rintf(".%-16s %2
21c00 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e  d", zName, p->u.
21c10 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20  btree.nEq);.    
21c20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
21c30 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
21c40 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20  "%20s","");.    
21c50 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
21c60 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20  har *z;.    if( 
21c70 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
21c80 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   ){.      z = sq
21c90 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
21ca0 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a  %d,\"%s\",%x)",.
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cc0 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
21cd0 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  , p->u.vtab.idxS
21ce0 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  tr, p->u.vtab.om
21cf0 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c  itMask);.    }el
21d00 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  se{.      z = sq
21d10 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
21d20 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74  %d,%x)", p->u.vt
21d30 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
21d40 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a  vtab.omitMask);.
21d50 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
21d60 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
21d70 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73  -19s", z);.    s
21d80 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
21d90 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
21da0 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 34  ugPrintf(" f %04
21db0 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c  x N %d", p->wsFl
21dc0 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b  ags, p->nLTerm);
21dd0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
21de0 72 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c  rintf(" cost %d,
21df0 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65  %d,%d\n", p->rSe
21e00 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d  tup, p->rRun, p-
21e10 3e 6e 4f 75 74 29 3b 0a 23 69 66 64 65 66 20 53  >nOut);.#ifdef S
21e20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
21e30 45 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  E_EXPLAIN.  /* I
21e40 66 20 74 68 65 20 30 78 31 30 30 20 62 69 74 20  f the 0x100 bit 
21e50 6f 66 20 77 68 65 72 65 74 72 61 63 69 6e 67 20  of wheretracing 
21e60 69 73 20 73 65 74 2c 20 74 68 65 6e 20 73 68 6f  is set, then sho
21e70 77 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6e  w all of the con
21e80 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20 65 78 70  straint.  ** exp
21e90 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
21ea0 57 68 65 72 65 4c 6f 6f 70 2e 61 4c 54 65 72 6d  WhereLoop.aLTerm
21eb0 5b 5d 20 61 72 72 61 79 2e 0a 20 20 2a 2f 0a 20  [] array..  */. 
21ec0 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26   if( p->nLTerm &
21ed0 26 20 28 73 71 6c 69 74 65 33 57 68 65 72 65 54  & (sqlite3WhereT
21ee0 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30  race & 0x100)!=0
21ef0 20 29 7b 20 20 2f 2a 20 57 48 45 52 45 54 52 41   ){  /* WHERETRA
21f00 43 45 20 30 78 31 30 30 20 2a 2f 0a 20 20 20 20  CE 0x100 */.    
21f10 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 20  int i;.    Vdbe 
21f20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  *v = pWInfo->pPa
21f30 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
21f40 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42 65  sqlite3ExplainBe
21f50 67 69 6e 28 76 29 3b 0a 20 20 20 20 66 6f 72 28  gin(v);.    for(
21f60 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d  i=0; i<p->nLTerm
21f70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68  ; i++){.      Wh
21f80 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d  ereTerm *pTerm =
21f90 20 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3b 0a 20   p->aLTerm[i];. 
21fa0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
21fb0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
21fc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
21fd0 69 6e 50 72 69 6e 74 66 28 76 2c 20 22 20 20 28  inPrintf(v, "  (
21fe0 25 64 29 20 23 25 2d 32 64 20 22 2c 20 69 2b 31  %d) #%-2d ", i+1
21ff0 2c 20 28 69 6e 74 29 28 70 54 65 72 6d 2d 70 57  , (int)(pTerm-pW
22000 43 2d 3e 61 29 29 3b 0a 20 20 20 20 20 20 73 71  C->a));.      sq
22010 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68  lite3ExplainPush
22020 28 76 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65  (v);.      where
22030 45 78 70 6c 61 69 6e 54 65 72 6d 28 76 2c 20 70  ExplainTerm(v, p
22040 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  Term);.      sql
22050 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 76  ite3ExplainPop(v
22060 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22070 45 78 70 6c 61 69 6e 4e 4c 28 76 29 3b 0a 20 20  ExplainNL(v);.  
22080 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
22090 78 70 6c 61 69 6e 46 69 6e 69 73 68 28 76 29 3b  xplainFinish(v);
220a0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
220b0 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  gPrintf("%s", sq
220c0 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 6e 61  lite3VdbeExplana
220d0 74 69 6f 6e 28 76 29 29 3b 0a 20 20 7d 0a 23 65  tion(v));.  }.#e
220e0 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ndif.}.#endif../
220f0 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c  *.** Convert bul
22100 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20  k memory into a 
22110 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70 20  valid WhereLoop 
22120 74 68 61 74 20 63 61 6e 20 62 65 20 70 61 73 73  that can be pass
22130 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f  ed.** to whereLo
22140 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73 73  opClear harmless
22150 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
22160 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  id whereLoopInit
22170 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a  (WhereLoop *p){.
22180 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d    p->aLTerm = p-
22190 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20  >aLTermSpace;.  
221a0 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  p->nLTerm = 0;. 
221b0 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72   p->nLSlot = Arr
221c0 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d  aySize(p->aLTerm
221d0 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46  Space);.  p->wsF
221e0 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  lags = 0;.}../*.
221f0 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68 65  ** Clear the Whe
22200 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20  reLoop.u union. 
22210 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f 70   Leave WhereLoop
22220 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a  .pLTerm intact..
22230 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
22240 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
22250 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  on(sqlite3 *db, 
22260 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
22270 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20   if( p->wsFlags 
22280 26 20 28 57 48 45 52 45 5f 56 49 52 54 55 41 4c  & (WHERE_VIRTUAL
22290 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f  TABLE|WHERE_AUTO
222a0 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 69  _INDEX) ){.    i
222b0 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
222c0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
222d0 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e  BLE)!=0 && p->u.
222e0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
222f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
22300 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64  ree(p->u.vtab.id
22310 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  xStr);.      p->
22320 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
22330 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  = 0;.      p->u.
22340 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b  vtab.idxStr = 0;
22350 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
22360 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
22370 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
22380 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e  0 && p->u.btree.
22390 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20  pIndex!=0 ){.   
223a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
223b0 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  (db, p->u.btree.
223c0 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29  pIndex->zColAff)
223d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b  ;.      sqlite3K
223e0 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 2d 3e 75  eyInfoUnref(p->u
223f0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 70  .btree.pIndex->p
22400 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  KeyInfo);.      
22410 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22420 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  , p->u.btree.pIn
22430 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75  dex);.      p->u
22440 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
22450 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
22460 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
22470 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79   internal memory
22480 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72 65   used by a Where
22490 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
224a0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
224b0 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74 65  LoopClear(sqlite
224c0 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
224d0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61   *p){.  if( p->a
224e0 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d  LTerm!=p->aLTerm
224f0 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33 44  Space ) sqlite3D
22500 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54  bFree(db, p->aLT
22510 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  erm);.  whereLoo
22520 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20  pClearUnion(db, 
22530 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49  p);.  whereLoopI
22540 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nit(p);.}../*.**
22550 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d 65   Increase the me
22560 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
22570 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  for pLoop->aLTer
22580 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65 61  m[] to be at lea
22590 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  st n..*/.static 
225a0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  int whereLoopRes
225b0 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ize(sqlite3 *db,
225c0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69   WhereLoop *p, i
225d0 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54 65  nt n){.  WhereTe
225e0 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66  rm **paNew;.  if
225f0 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29  ( p->nLSlot>=n )
22600 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22610 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e  K;.  n = (n+7)&~
22620 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71 6c  7;.  paNew = sql
22630 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
22640 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  db, sizeof(p->aL
22650 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69  Term[0])*n);.  i
22660 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65  f( paNew==0 ) re
22670 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
22680 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65  M;.  memcpy(paNe
22690 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69  w, p->aLTerm, si
226a0 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30  zeof(p->aLTerm[0
226b0 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20  ])*p->nLSlot);. 
226c0 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
226d0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
226e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
226f0 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
22700 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e   p->aLTerm = paN
22710 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20  ew;.  p->nLSlot 
22720 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = n;.  return SQ
22730 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
22740 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65  * Transfer conte
22750 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  nt from the seco
22760 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68  nd pLoop into th
22770 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74  e first..*/.stat
22780 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
22790 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  Xfer(sqlite3 *db
227a0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f  , WhereLoop *pTo
227b0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72  , WhereLoop *pFr
227c0 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  om){.  whereLoop
227d0 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70  ClearUnion(db, p
227e0 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65  To);.  if( where
227f0 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
22800 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72  To, pFrom->nLTer
22810 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  m) ){.    memset
22820 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a  (&pTo->u, 0, siz
22830 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20  eof(pTo->u));.  
22840 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22850 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
22860 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20  cpy(pTo, pFrom, 
22870 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f  WHERE_LOOP_XFER_
22880 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  SZ);.  memcpy(pT
22890 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d  o->aLTerm, pFrom
228a0 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e  ->aLTerm, pTo->n
228b0 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f  LTerm*sizeof(pTo
228c0 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20  ->aLTerm[0]));. 
228d0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c   if( pFrom->wsFl
228e0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
228f0 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20  UALTABLE ){.    
22900 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65  pFrom->u.vtab.ne
22910 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  edFree = 0;.  }e
22920 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e  lse if( (pFrom->
22930 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
22940 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
22950 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62  {.    pFrom->u.b
22960 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
22970 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
22980 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
22990 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65 72 65  * Delete a Where
229a0 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
229b0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
229c0 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69 74  LoopDelete(sqlit
229d0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
229e0 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f  p *p){.  whereLo
229f0 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a  opClear(db, p);.
22a00 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
22a10 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
22a20 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66   Free a WhereInf
22a30 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73  o structure.*/.s
22a40 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
22a50 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33  InfoFree(sqlite3
22a60 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20   *db, WhereInfo 
22a70 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20  *pWInfo){.  if( 
22a80 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29  ALWAYS(pWInfo) )
22a90 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
22aa0 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e  eClear(&pWInfo->
22ab0 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  sWC);.    while(
22ac0 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
22ad0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f  ){.      WhereLo
22ae0 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  op *p = pWInfo->
22af0 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57  pLoops;.      pW
22b00 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70  Info->pLoops = p
22b10 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
22b20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65     whereLoopDele
22b30 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d  te(db, p);.    }
22b40 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
22b50 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
22b60 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
22b70 75 72 6e 20 54 52 55 45 20 69 66 20 62 6f 74 68  urn TRUE if both
22b80 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
22b90 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
22ba0 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20 74  *   (1)  X has t
22bb0 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
22bc0 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20   cost that Y.** 
22bd0 20 20 28 32 29 20 20 58 20 69 73 20 61 20 70 72    (2)  X is a pr
22be0 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
22bf0 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f 70 65  .**.** By "prope
22c00 72 20 73 75 62 73 65 74 22 20 77 65 20 6d 65 61  r subset" we mea
22c10 6e 20 74 68 61 74 20 58 20 75 73 65 73 20 66 65  n that X uses fe
22c20 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  wer WHERE clause
22c30 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e 20 59   terms.** than Y
22c40 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79 20   and that every 
22c50 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
22c60 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 20 61  m used by X is a
22c70 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79 20 59  lso used.** by Y
22c80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20  ..**.** If X is 
22c90 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
22ca0 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73 20 61  of Y then Y is a
22cb0 20 62 65 74 74 65 72 20 63 68 6f 69 63 65 20 61   better choice a
22cc0 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68  nd ought.** to h
22cd0 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74  ave a lower cost
22ce0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
22cf0 72 65 74 75 72 6e 73 20 54 52 55 45 20 77 68 65  returns TRUE whe
22d00 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20  n that cost .** 
22d10 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73 20  relationship is 
22d20 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65 65  inverted and nee
22d30 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65  ds to be adjuste
22d40 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
22d50 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65   whereLoopCheape
22d60 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 0a 20  rProperSubset(. 
22d70 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
22d80 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a 20 46   *pX,       /* F
22d90 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 74  irst WhereLoop t
22da0 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63  o compare */.  c
22db0 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
22dc0 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  pY        /* Com
22dd0 70 61 72 65 20 61 67 61 69 6e 73 74 20 74 68 69  pare against thi
22de0 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29  s WhereLoop */.)
22df0 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
22e00 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 20 3e  if( pX->nLTerm >
22e10 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 20 29 20 72  = pY->nLTerm ) r
22e20 65 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73  eturn 0; /* X is
22e30 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66   not a subset of
22e40 20 59 20 2a 2f 0a 20 20 69 66 28 20 70 58 2d 3e   Y */.  if( pX->
22e50 72 52 75 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e  rRun >= pY->rRun
22e60 20 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e   ){.    if( pX->
22e70 72 52 75 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20  rRun > pY->rRun 
22e80 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f  ) return 0;    /
22e90 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74  * X costs more t
22ea0 68 61 6e 20 59 20 2a 2f 0a 20 20 20 20 69 66 28  han Y */.    if(
22eb0 20 70 58 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e   pX->nOut > pY->
22ec0 6e 4f 75 74 20 29 20 72 65 74 75 72 6e 20 30 3b  nOut ) return 0;
22ed0 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d      /* X costs m
22ee0 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20  ore than Y */.  
22ef0 7d 0a 20 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c  }.  for(i=pX->nL
22f00 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
22f10 2d 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59  -){.    for(j=pY
22f20 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30  ->nLTerm-1; j>=0
22f30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  ; j--){.      if
22f40 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d  ( pY->aLTerm[j]=
22f50 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29  =pX->aLTerm[i] )
22f60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
22f70 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75    if( j<0 ) retu
22f80 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20  rn 0;  /* X not 
22f90 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 73 69  a subset of Y si
22fa0 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f  nce term X[i] no
22fb0 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20  t used by Y */. 
22fc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 20 20   }.  return 1;  
22fd0 2f 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e  /* All condition
22fe0 73 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  s meet */.}../*.
22ff0 2a 2a 20 54 72 79 20 74 6f 20 61 64 6a 75 73 74  ** Try to adjust
23000 20 74 68 65 20 63 6f 73 74 20 6f 66 20 57 68 65   the cost of Whe
23010 72 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65  reLoop pTemplate
23020 20 75 70 77 61 72 64 73 20 6f 72 20 64 6f 77 6e   upwards or down
23030 77 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74  wards so.** that
23040 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54  :.**.**   (1) pT
23050 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6c 65  emplate costs le
23060 73 73 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65  ss than any othe
23070 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 68 61  r WhereLoops tha
23080 74 20 61 72 65 20 61 20 70 72 6f 70 65 72 0a 2a  t are a proper.*
23090 2a 20 20 20 20 20 20 20 73 75 62 73 65 74 20 6f  *       subset o
230a0 66 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a  f pTemplate.**.*
230b0 2a 20 20 20 28 32 29 20 70 54 65 6d 70 6c 61 74  *   (2) pTemplat
230c0 65 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61  e costs more tha
230d0 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72  n any other Wher
230e0 65 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69 63 68  eLoops for which
230f0 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20   pTemplate.**   
23100 20 20 20 20 69 73 20 61 20 70 72 6f 70 65 72 20      is a proper 
23110 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f  subset..**.** To
23120 20 73 61 79 20 22 57 68 65 72 65 4c 6f 6f 70 20   say "WhereLoop 
23130 58 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  X is a proper su
23140 62 73 65 74 20 6f 66 20 59 22 20 6d 65 61 6e 73  bset of Y" means
23150 20 74 68 61 74 20 58 20 75 73 65 73 20 66 65 77   that X uses few
23160 65 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  er.** WHERE clau
23170 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20 59 20  se terms than Y 
23180 61 6e 64 20 74 68 61 74 20 65 76 65 72 79 20 57  and that every W
23190 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
231a0 20 75 73 65 64 20 62 79 20 58 20 69 73 0a 2a 2a   used by X is.**
231b0 20 61 6c 73 6f 20 75 73 65 64 20 62 79 20 59 2e   also used by Y.
231c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 64 6a 75  .**.** This adju
231d0 73 74 6d 65 6e 74 20 69 73 20 6f 6d 69 74 74 65  stment is omitte
231e0 64 20 66 6f 72 20 53 4b 49 50 53 43 41 4e 20 6c  d for SKIPSCAN l
231f0 6f 6f 70 73 2e 20 20 49 6e 20 61 20 53 4b 49 50  oops.  In a SKIP
23200 53 43 41 4e 20 6c 6f 6f 70 2c 20 74 68 65 0a 2a  SCAN loop, the.*
23210 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4c 54 65  * WhereLoop.nLTe
23220 72 6d 20 66 69 65 6c 64 20 69 73 20 6e 6f 74 20  rm field is not 
23230 61 6e 20 61 63 63 75 72 61 74 65 20 6d 65 61 73  an accurate meas
23240 75 72 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ure of the numbe
23250 72 20 6f 66 20 57 48 45 52 45 0a 2a 2a 20 63 6c  r of WHERE.** cl
23260 61 75 73 65 20 74 65 72 6d 73 20 63 6f 76 65 72  ause terms cover
23270 65 64 2c 20 73 69 6e 63 65 20 73 6f 6d 65 20 6f  ed, since some o
23280 66 20 74 68 65 20 66 69 72 73 74 20 6e 4c 54 65  f the first nLTe
23290 72 6d 20 65 6e 74 72 69 65 73 20 69 6e 20 61 4c  rm entries in aL
232a0 54 65 72 6d 5b 5d 0a 2a 2a 20 77 69 6c 6c 20 62  Term[].** will b
232b0 65 20 4e 55 4c 4c 20 28 62 65 63 61 75 73 65 20  e NULL (because 
232c0 74 68 65 79 20 61 72 65 20 73 6b 69 70 70 65 64  they are skipped
232d0 29 2e 20 20 54 68 61 74 20 6d 61 6b 65 73 20 69  ).  That makes i
232e0 74 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74  t more difficult
232f0 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 74  .** to compare t
23300 68 65 20 6c 6f 6f 70 73 2e 20 20 57 65 20 63 6f  he loops.  We co
23310 75 6c 64 20 61 64 64 20 65 78 74 72 61 20 63 6f  uld add extra co
23320 64 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  de to do the com
23330 70 61 72 69 73 6f 6e 2c 20 61 6e 64 0a 2a 2a 20  parison, and.** 
23340 70 65 72 68 61 70 73 20 77 65 20 77 69 6c 6c 20  perhaps we will 
23350 73 6f 6d 65 64 61 79 2e 20 20 42 75 74 20 53 4b  someday.  But SK
23360 49 50 53 43 41 4e 20 69 73 20 73 75 66 66 69 63  IPSCAN is suffic
23370 69 65 6e 74 6c 79 20 75 6e 63 6f 6d 6d 6f 6e 2c  iently uncommon,
23380 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 61 64 6a   and this.** adj
23390 75 73 74 6d 65 6e 74 20 69 73 20 73 75 66 66 69  ustment is suffi
233a0 63 69 65 6e 74 20 6d 69 6e 6f 72 2c 20 74 68 61  cient minor, tha
233b0 74 20 69 74 20 69 73 20 76 65 72 79 20 64 69 66  t it is very dif
233c0 66 69 63 75 6c 74 20 74 6f 20 63 6f 6e 73 74 72  ficult to constr
233d0 75 63 74 0a 2a 2a 20 61 20 74 65 73 74 20 63 61  uct.** a test ca
233e0 73 65 20 77 68 65 72 65 20 74 68 65 20 65 78 74  se where the ext
233f0 72 61 20 63 6f 64 65 20 77 6f 75 6c 64 20 69 6d  ra code would im
23400 70 72 6f 76 65 20 74 68 65 20 71 75 65 72 79 20  prove the query 
23410 70 6c 61 6e 2e 20 20 42 65 74 74 65 72 0a 2a 2a  plan.  Better.**
23420 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 61 64   to avoid the ad
23430 64 65 64 20 63 6f 6d 70 6c 65 78 69 74 79 20 61  ded complexity a
23440 6e 64 20 6a 75 73 74 20 6f 6d 69 74 20 63 6f 73  nd just omit cos
23450 74 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f  t adjustments to
23460 20 53 4b 49 50 53 43 41 4e 0a 2a 2a 20 6c 6f 6f   SKIPSCAN.** loo
23470 70 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ps..*/.static vo
23480 69 64 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75  id whereLoopAdju
23490 73 74 43 6f 73 74 28 63 6f 6e 73 74 20 57 68 65  stCost(const Whe
234a0 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65  reLoop *p, Where
234b0 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29  Loop *pTemplate)
234c0 7b 0a 20 20 69 66 28 20 28 70 54 65 6d 70 6c 61  {.  if( (pTempla
234d0 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  te->wsFlags & WH
234e0 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20  ERE_INDEXED)==0 
234f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
23500 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
23510 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50  ags & WHERE_SKIP
23520 53 43 41 4e 29 21 3d 30 20 29 20 72 65 74 75 72  SCAN)!=0 ) retur
23530 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d  n;.  for(; p; p=
23540 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
23550 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d     if( p->iTab!=
23560 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20  pTemplate->iTab 
23570 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
23580 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
23590 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
235a0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
235b0 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c      if( (p->wsFl
235c0 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50  ags & WHERE_SKIP
235d0 53 43 41 4e 29 21 3d 30 20 29 20 63 6f 6e 74 69  SCAN)!=0 ) conti
235e0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 77 68 65  nue;.    if( whe
235f0 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f  reLoopCheaperPro
23600 70 65 72 53 75 62 73 65 74 28 70 2c 20 70 54 65  perSubset(p, pTe
23610 6d 70 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20  mplate) ){.     
23620 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70   /* Adjust pTemp
23630 6c 61 74 65 20 63 6f 73 74 20 64 6f 77 6e 77 61  late cost downwa
23640 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  rd so that it is
23650 20 63 68 65 61 70 65 72 20 74 68 61 6e 20 69 74   cheaper than it
23660 73 20 0a 20 20 20 20 20 20 2a 2a 20 73 75 62 73  s .      ** subs
23670 65 74 20 70 20 2a 2f 0a 20 20 20 20 20 20 70 54  et p */.      pT
23680 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20  emplate->rRun = 
23690 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70  p->rRun;.      p
236a0 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d  Template->nOut =
236b0 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20   p->nOut - 1;.  
236c0 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72    }else if( wher
236d0 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70  eLoopCheaperProp
236e0 65 72 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61  erSubset(pTempla
236f0 74 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20  te, p) ){.      
23700 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c  /* Adjust pTempl
23710 61 74 65 20 63 6f 73 74 20 75 70 77 61 72 64 20  ate cost upward 
23720 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 6f  so that it is co
23730 73 74 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69  stlier than p si
23740 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65  nce.      ** pTe
23750 6d 70 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70  mplate is a prop
23760 65 72 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a  er subset of p *
23770 2f 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  /.      pTemplat
23780 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75  e->rRun = p->rRu
23790 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  n;.      pTempla
237a0 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f  te->nOut = p->nO
237b0 75 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ut + 1;.    }.  
237c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  }.}../*.** Searc
237d0 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68  h the list of Wh
237e0 65 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50  ereLoops in *ppP
237f0 72 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  rev looking for 
23800 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a  one that can be.
23810 2a 2a 20 73 75 70 70 6c 61 6e 74 65 64 20 62 79  ** supplanted by
23820 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a   pTemplate..**.*
23830 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
23840 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c   the WhereLoop l
23850 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ist contains an 
23860 65 6e 74 72 79 20 74 68 61 74 20 63 61 6e 20 73  entry that can s
23870 75 70 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70  upplant.** pTemp
23880 6c 61 74 65 2c 20 69 6e 20 6f 74 68 65 72 20 77  late, in other w
23890 6f 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61 74  ords if pTemplat
238a0 65 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e  e does not belon
238b0 67 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  g on the list..*
238c0 2a 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20  *.** If pX is a 
238d0 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70  WhereLoop that p
238e0 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 73 75 70  Template can sup
238f0 70 6c 61 6e 74 2c 20 74 68 65 6e 20 72 65 74 75  plant, then retu
23900 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74  rn the.** link t
23910 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 58  hat points to pX
23920 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70  ..**.** If pTemp
23930 6c 61 74 65 20 63 61 6e 6e 6f 74 20 73 75 70 70  late cannot supp
23940 6c 61 6e 74 20 61 6e 79 20 65 78 69 73 74 69 6e  lant any existin
23950 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  g element of the
23960 20 6c 69 73 74 20 62 75 74 20 6e 65 65 64 73 0a   list but needs.
23970 2a 2a 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ** to be added t
23980 6f 20 74 68 65 20 6c 69 73 74 2c 20 74 68 65 6e  o the list, then
23990 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
239a0 72 20 74 6f 20 74 68 65 20 74 61 69 6c 20 6f 66  r to the tail of
239b0 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
239c0 61 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a  atic WhereLoop *
239d0 2a 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65  *whereLoopFindLe
239e0 73 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f  sser(.  WhereLoo
239f0 70 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f  p **ppPrev,.  co
23a00 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
23a10 54 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68  Template.){.  Wh
23a20 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f  ereLoop *p;.  fo
23a30 72 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70  r(p=(*ppPrev); p
23a40 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65  ; ppPrev=&p->pNe
23a50 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65  xtLoop, p=*ppPre
23a60 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  v){.    if( p->i
23a70 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Tab!=pTemplate->
23a80 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74  iTab || p->iSort
23a90 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Idx!=pTemplate->
23aa0 69 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20  iSortIdx ){.    
23ab0 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74    /* If either t
23ac0 68 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74  he iTab or iSort
23ad0 49 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74  Idx values for t
23ae0 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65  wo WhereLoop are
23af0 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20   different.     
23b00 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57   ** then those W
23b10 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74  hereLoops need t
23b20 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20  o be considered 
23b30 73 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69  separately.  Nei
23b40 74 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ther is.      **
23b50 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20   a candidate to 
23b60 72 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65  replace the othe
23b70 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  r. */.      cont
23b80 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
23b90 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e  /* In the curren
23ba0 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
23bb0 2c 20 74 68 65 20 72 53 65 74 75 70 20 76 61 6c  , the rSetup val
23bc0 75 65 20 69 73 20 65 69 74 68 65 72 20 7a 65 72  ue is either zer
23bd0 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20  o.    ** or the 
23be0 63 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67  cost of building
23bf0 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
23c00 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20  dex (NlogN) and 
23c10 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a  the NlogN.    **
23c20 20 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72   is the same for
23c30 20 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72   compatible Wher
23c40 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61  eLoops. */.    a
23c50 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
23c60 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65  ==0 || pTemplate
23c70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20  ->rSetup==0 .   
23c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
23c90 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d   p->rSetup==pTem
23ca0 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
23cb0 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f  ..    /* whereLo
23cc0 6f 70 41 64 64 42 74 72 65 65 28 29 20 61 6c 77  opAddBtree() alw
23cd0 61 79 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e  ays generates an
23ce0 64 20 69 6e 73 65 72 74 73 20 74 68 65 20 61 75  d inserts the au
23cf0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20  tomatic index.  
23d00 20 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e    ** case first.
23d10 20 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62    Hence compatib
23d20 6c 65 20 63 61 6e 64 69 64 61 74 65 20 57 68 65  le candidate Whe
23d30 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61  reLoops never ha
23d40 76 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20  ve a larger.    
23d50 2a 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20  ** rSetup. Call 
23d60 74 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52  this SETUP-INVAR
23d70 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65  IANT */.    asse
23d80 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70  rt( p->rSetup>=p
23d90 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
23da0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65   );..    /* If e
23db0 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
23dc0 70 20 70 20 69 73 20 62 65 74 74 65 72 20 74 68  p p is better th
23dd0 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70 54  an pTemplate, pT
23de0 65 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a 20  emplate can be. 
23df0 20 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64 2e     ** discarded.
23e00 20 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73    WhereLoop p is
23e10 20 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20 20   better if:.    
23e20 2a 2a 20 20 20 28 31 29 20 20 70 20 68 61 73 20  **   (1)  p has 
23e30 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e  no more dependen
23e40 63 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70 6c  cies than pTempl
23e50 61 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ate, and.    ** 
23e60 20 20 28 32 29 20 20 70 20 68 61 73 20 61 6e 20    (2)  p has an 
23e70 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63  equal or lower c
23e80 6f 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ost than pTempla
23e90 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  te.    */.    if
23ea0 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
23eb0 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
23ec0 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20 20  )==p->prereq    
23ed0 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20  /* (1)  */.     
23ee0 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54  && p->rSetup<=pT
23ef0 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
23f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f10 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20   /* (2a) */.    
23f20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65   && p->rRun<=pTe
23f30 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20  mplate->rRun    
23f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f50 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20    /* (2b) */.   
23f60 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54    && p->nOut<=pT
23f70 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20  emplate->nOut   
23f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f90 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20     /* (2c) */.  
23fa0 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
23fb0 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72 64  n 0;  /* Discard
23fc0 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
23fd0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70    }..    /* If p
23fe0 54 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77 61  Template is alwa
23ff0 79 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70  ys better than p
24000 2c 20 74 68 65 6e 20 63 61 75 73 65 20 70 20 74  , then cause p t
24010 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  o be overwritten
24020 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54 65  .    ** with pTe
24030 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c 61  mplate.  pTempla
24040 74 65 20 69 73 20 62 65 74 74 65 72 20 74 68 61  te is better tha
24050 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20  n p if:.    **  
24060 20 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65 20   (1)  pTemplate 
24070 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65  has no more depe
24080 6e 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c 20  ndences than p, 
24090 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29  and.    **   (2)
240a0 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20    pTemplate has 
240b0 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65  an equal or lowe
240c0 72 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20  r cost than p.. 
240d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
240e0 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70  ->prereq & pTemp
240f0 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70  late->prereq)==p
24100 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
24110 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20     /* (1)  */.  
24120 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70     && p->rRun>=p
24130 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20  Template->rRun  
24140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
24160 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  a) */.     && p-
24170 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65  >nOut>=pTemplate
24180 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  ->nOut          
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241a0 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20     /* (2b) */.  
241b0 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
241c0 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  t( p->rSetup>=pT
241d0 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
241e0 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41  ); /* SETUP-INVA
241f0 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20  RIANT above */. 
24200 20 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a       break;   /*
24210 20 43 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f   Cause p to be o
24220 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 70 54  verwritten by pT
24230 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d  emplate */.    }
24240 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 70  .  }.  return pp
24250 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  Prev;.}../*.** I
24260 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65  nsert or replace
24270 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74   a WhereLoop ent
24280 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d  ry using the tem
24290 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a  plate supplied..
242a0 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
242b0 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  g WhereLoop entr
242c0 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77  y might be overw
242d0 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65  ritten if the ne
242e0 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73  w template.** is
242f0 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20   better and has 
24300 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
24310 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70  es.  Or the temp
24320 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e  late will be ign
24330 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69  ored.** and no i
24340 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72  nsert will occur
24350 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
24360 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73  WhereLoop is fas
24370 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66  ter and has.** f
24380 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
24390 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c  s than the templ
243a0 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ate.  Otherwise 
243b0 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20  a new WhereLoop 
243c0 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65  is.** added base
243d0 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  d on the templat
243e0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69  e..**.** If pBui
243f0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
24400 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65  not NULL then we
24410 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79   care about only
24420 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69   the.** prerequi
24430 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61  sites and rRun a
24440 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66  nd nOut costs of
24450 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70   the N best loop
24460 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f  s.  That.** info
24470 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65  rmation is gathe
24480 72 65 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c  red in the pBuil
24490 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65  der->pOrSet obje
244a0 63 74 2e 20 20 54 68 69 73 20 73 70 65 63 69 61  ct.  This specia
244b0 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20  l.** processing 
244c0 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  mode is used onl
244d0 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20  y for OR clause 
244e0 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
244f0 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74  * When accumulat
24500 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f  ing multiple loo
24510 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65  ps (when pBuilde
24520 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c  r->pOrSet is NUL
24530 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d  L) we.** still m
24540 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 73  ight overwrite s
24550 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74  imilar loops wit
24560 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61  h the new templa
24570 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77  te if the.** new
24580 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74   template is bet
24590 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20  ter.  Loops may 
245a0 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69  be overwritten i
245b0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
245c0 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  .** conditions a
245d0 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  re met:.**.**   
245e0 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20   (1)  They have 
245f0 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a  the same iTab..*
24600 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68  *    (2)  They h
24610 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f  ave the same iSo
24620 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29  rtIdx..**    (3)
24630 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68    The template h
24640 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72  as same or fewer
24650 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68   dependencies th
24660 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  an the current l
24670 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54  oop.**    (4)  T
24680 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20  he template has 
24690 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65  the same or lowe
246a0 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20  r cost than the 
246b0 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a  current loop.*/.
246c0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
246d0 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65  LoopInsert(Where
246e0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
246f0 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70  ilder, WhereLoop
24700 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20   *pTemplate){.  
24710 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72  WhereLoop **ppPr
24720 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65 49  ev, *p;.  WhereI
24730 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
24740 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
24750 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
24760 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
24770 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75  db;..  /* If pBu
24780 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
24790 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f   defined, then o
247a0 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f  nly keep track o
247b0 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a  f the costs.  **
247c0 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20   and prereqs..  
247d0 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
247e0 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a  r->pOrSet!=0 ){.
247f0 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
24800 4e 41 42 4c 45 44 0a 20 20 20 20 75 31 36 20 6e  NABLED.    u16 n
24810 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72   = pBuilder->pOr
24820 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20  Set->n;.    int 
24830 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77  x =.#endif.    w
24840 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75  hereOrInsert(pBu
24850 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70  ilder->pOrSet, p
24860 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
24870 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  , pTemplate->rRu
24880 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
24890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248a0 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
248b0 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45  ->nOut);.#if WHE
248c0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
248d0 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66  /* 0x8 */.    if
248e0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
248f0 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
24900 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24910 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25  rintf(x?"   or-%
24920 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20  d:  ":"   or-X: 
24930 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20 77 68   ", n);.      wh
24940 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
24950 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72  mplate, pBuilder
24960 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65  ->pWC);.    }.#e
24970 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
24980 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
24990 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e    /* Look for an
249a0 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
249b0 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77  oop to replace w
249c0 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  ith pTemplate.  
249d0 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  */.  whereLoopAd
249e0 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d  justCost(pWInfo-
249f0 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
24a00 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20  te);.  ppPrev = 
24a10 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
24a20 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ser(&pWInfo->pLo
24a30 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
24a40 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d  ..  if( ppPrev==
24a50 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
24a60 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
24a70 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20   a WhereLoop on 
24a80 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  the list that is
24a90 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
24aa0 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73  han pTemplate, s
24ab0 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54  o just ignore pT
24ac0 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57  emplate */.#if W
24ad0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
24ae0 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
24af0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
24b00 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
24b10 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
24b20 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e 6f 6f  gPrintf("ins-noo
24b30 70 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65  p: ");.      whe
24b40 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
24b50 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d  plate, pBuilder-
24b60 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  >pWC);.    }.#en
24b70 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
24b80 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65  QLITE_OK;  .  }e
24b90 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70  lse{.    p = *pp
24ba0 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Prev;.  }..  /* 
24bb0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
24bc0 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20   point it means 
24bd0 74 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20  that either p[] 
24be0 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72  should be overwr
24bf0 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20  itten.  ** with 
24c00 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70  pTemplate[] if p
24c10 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66  [] exists, or if
24c20 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c   p==NULL then al
24c30 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a  locate a new.  *
24c40 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20  * WhereLoop and 
24c50 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a  insert it..  */.
24c60 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
24c70 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
24c80 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
24c90 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
24ca0 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29  {.    if( p!=0 )
24cb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
24cc0 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d  ebugPrintf("ins-
24cd0 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20 20  del:  ");.      
24ce0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
24cf0 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
24d00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
24d10 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24d20 69 6e 73 2d 6e 65 77 3a 20 20 22 29 3b 0a 20 20  ins-new:  ");.  
24d30 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
24d40 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
24d50 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a  lder->pWC);.  }.
24d60 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d  #endif.  if( p==
24d70 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f  0 ){.    /* Allo
24d80 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65  cate a new Where
24d90 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74  Loop to add to t
24da0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69  he end of the li
24db0 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65  st */.    *ppPre
24dc0 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44  v = p = sqlite3D
24dd0 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
24de0 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29  izeof(WhereLoop)
24df0 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
24e00 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
24e10 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65  NOMEM;.    where
24e20 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20  LoopInit(p);.   
24e30 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20   p->pNextLoop = 
24e40 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
24e50 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76  /* We will be ov
24e60 65 72 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c  erwriting WhereL
24e70 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65  oop p[].  But be
24e80 66 6f 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73  fore we do, firs
24e90 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f  t.    ** go thro
24ea0 75 67 68 20 74 68 65 20 72 65 73 74 20 6f 66 20  ugh the rest of 
24eb0 74 68 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c  the list and del
24ec0 65 74 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e  ete any other en
24ed0 74 72 69 65 73 20 62 65 73 69 64 65 73 0a 20 20  tries besides.  
24ee0 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72    ** p[] that ar
24ef0 65 20 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64  e also supplated
24f00 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f   by pTemplate */
24f10 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
24f20 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e  *ppTail = &p->pN
24f30 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65  extLoop;.    Whe
24f40 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a  reLoop *pToDel;.
24f50 20 20 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61      while( *ppTa
24f60 69 6c 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61  il ){.      ppTa
24f70 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69  il = whereLoopFi
24f80 6e 64 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c  ndLesser(ppTail,
24f90 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20   pTemplate);.   
24fa0 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 70 54     if( NEVER(ppT
24fb0 61 69 6c 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  ail==0) ) break;
24fc0 0a 20 20 20 20 20 20 70 54 6f 44 65 6c 20 3d 20  .      pToDel = 
24fd0 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20 69  *ppTail;.      i
24fe0 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62  f( pToDel==0 ) b
24ff0 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54  reak;.      *ppT
25000 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e  ail = pToDel->pN
25010 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45  extLoop;.#if WHE
25020 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
25030 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20  /* 0x8 */.      
25040 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
25050 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
25060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
25070 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 64  bugPrintf("ins-d
25080 65 6c 3a 20 22 29 3b 0a 20 20 20 20 20 20 20 20  el: ");.        
25090 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
250a0 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d  ToDel, pBuilder-
250b0 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23  >pWC);.      }.#
250c0 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65 72  endif.      wher
250d0 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
250e0 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  pToDel);.    }. 
250f0 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58 66   }.  whereLoopXf
25100 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c  er(db, p, pTempl
25110 61 74 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ate);.  if( (p->
25120 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
25130 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
25140 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
25150 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72  Index = p->u.btr
25160 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  ee.pIndex;.    i
25170 66 28 20 70 49 6e 64 65 78 20 26 26 20 70 49 6e  f( pIndex && pIn
25180 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a  dex->tnum==0 ){.
25190 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65        p->u.btree
251a0 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
251b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
251c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
251d0 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57  .** Adjust the W
251e0 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61  hereLoop.nOut va
251f0 6c 75 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20  lue downward to 
25200 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d  account for term
25210 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52  s of the.** WHER
25220 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 72 65  E clause that re
25230 66 65 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70  ference the loop
25240 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
25250 6f 74 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a  ot used by an.**
25260 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e   index..**.** In
25270 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
25280 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65  lementation, the
25290 20 66 69 72 73 74 20 65 78 74 72 61 20 57 48 45   first extra WHE
252a0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 72  RE clause term r
252b0 65 64 75 63 65 73 0a 2a 2a 20 74 68 65 20 6e 75  educes.** the nu
252c0 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
252d0 6f 77 73 20 62 79 20 61 20 66 61 63 74 6f 72 20  ows by a factor 
252e0 6f 66 20 31 30 20 61 6e 64 20 65 61 63 68 20 61  of 10 and each a
252f0 64 64 69 74 69 6f 6e 61 6c 20 74 65 72 6d 0a 2a  dditional term.*
25300 2a 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  * reduces the nu
25310 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
25320 6f 77 73 20 62 79 20 73 71 72 74 28 32 29 2e 0a  ows by sqrt(2)..
25330 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
25340 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64  hereLoopOutputAd
25350 6a 75 73 74 28 57 68 65 72 65 43 6c 61 75 73 65  just(WhereClause
25360 20 2a 70 57 43 2c 20 57 68 65 72 65 4c 6f 6f 70   *pWC, WhereLoop
25370 20 2a 70 4c 6f 6f 70 29 7b 0a 20 20 57 68 65 72   *pLoop){.  Wher
25380 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70  eTerm *pTerm, *p
25390 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  X;.  Bitmask not
253a0 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f  Allowed = ~(pLoo
253b0 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d  p->prereq|pLoop-
253c0 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e  >maskSelf);.  in
253d0 74 20 69 2c 20 6a 3b 0a 0a 20 20 69 66 28 20 21  t i, j;..  if( !
253e0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
253f0 6c 65 64 28 70 57 43 2d 3e 70 57 49 6e 66 6f 2d  led(pWC->pWInfo-
25400 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  >pParse->db, SQL
25410 49 54 45 5f 41 64 6a 75 73 74 4f 75 74 45 73 74  ITE_AdjustOutEst
25420 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
25430 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 57 43  .  }.  for(i=pWC
25440 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70  ->nTerm, pTerm=p
25450 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  WC->a; i>0; i--,
25460 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
25470 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  f( (pTerm->wtFla
25480 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
25490 4c 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  L)!=0 ) break;. 
254a0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
254b0 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70  rereqAll & pLoop
254c0 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29  ->maskSelf)==0 )
254d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
254e0 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
254f0 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65  qAll & notAllowe
25500 64 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  d)!=0 ) continue
25510 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f  ;.    for(j=pLoo
25520 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d  p->nLTerm-1; j>=
25530 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70  0; j--){.      p
25540 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  X = pLoop->aLTer
25550 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  m[j];.      if( 
25560 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  pX==0 ) continue
25570 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
25580 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20  pTerm ) break;. 
25590 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61       if( pX->iPa
255a0 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43  rent>=0 && (&pWC
255b0 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d  ->a[pX->iParent]
255c0 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b  )==pTerm ) break
255d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
255e0 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  j<0 ){.      pLo
255f0 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 54 65  op->nOut += (pTe
25600 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
25610 20 3f 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50   ? pTerm->truthP
25620 72 6f 62 20 3a 20 2d 31 29 3b 0a 20 20 20 20 7d  rob : -1);.    }
25630 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65  .  }.}../*.** We
25640 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74   have so far mat
25650 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70  ched pBuilder->p
25660 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
25670 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a   terms of the .*
25680 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 20  * index pIndex. 
25690 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65  Try to match one
256a0 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   more..**.** Whe
256b0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
256c0 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c  is called, pBuil
256d0 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20  der->pNew->nOut 
256e0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a  contains the .**
256f0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
25700 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20 76  expected to be v
25710 69 73 69 74 65 64 20 62 79 20 66 69 6c 74 65 72  isited by filter
25720 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 6e 45  ing using the nE
25730 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  q .** terms only
25740 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64 69 66  . If it is modif
25750 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75 65 20  ied, this value 
25760 69 73 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f  is restored befo
25770 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
25780 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
25790 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74  .** If pProbe->t
257a0 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  num==0, that mea
257b0 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66  ns pIndex is a f
257c0 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66  ake index used f
257d0 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  or the.** INTEGE
257e0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
257f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
25800 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
25810 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dex(.  WhereLoop
25820 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
25830 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  r,     /* The Wh
25840 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20  ereLoop factory 
25850 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
25860 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
25870 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
25880 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  use term being a
25890 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64  nalyzed */.  Ind
258a0 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20  ex *pProbe,     
258b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
258c0 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63  An index on pSrc
258d0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e   */.  LogEst nIn
258e0 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Mul             
258f0 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d        /* log(Num
25900 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
25910 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a  s due to IN) */.
25920 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
25930 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
25940 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57  r->pWInfo;  /* W
25950 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e  HERE analyse con
25960 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
25970 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
25980 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
25990 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
259a0 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
259b0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
259c0 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
259d0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
259e0 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a  malloc context *
259f0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
25a00 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
25a10 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
25a20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20  WhereLoop under 
25a30 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
25a40 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
25a50 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
25a60 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d    /* A WhereTerm
25a70 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61   under considera
25a80 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
25a90 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
25aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
25ab0 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  id operators for
25ac0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
25ad0 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
25ae0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25af0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
25b00 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f  r WHERE terms */
25b10 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64  .  Bitmask saved
25b20 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20  _prereq;        
25b30 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
25b40 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72  alue of pNew->pr
25b50 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  ereq */.  u16 sa
25b60 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20  ved_nLTerm;     
25b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
25b80 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
25b90 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20  New->nLTerm */. 
25ba0 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b 20   u16 saved_nEq; 
25bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bc0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
25bd0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
25be0 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36  ree.nEq */.  u16
25bf0 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20   saved_nSkip;   
25c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25c10 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
25c20 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  f pNew->u.btree.
25c30 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20 73  nSkip */.  u32 s
25c40 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20  aved_wsFlags;   
25c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
25c60 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
25c70 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f  pNew->wsFlags */
25c80 0a 20 20 4c 6f 67 45 73 74 20 73 61 76 65 64 5f  .  LogEst saved_
25c90 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  nOut;           
25ca0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
25cb0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f  alue of pNew->nO
25cc0 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  ut */.  int iCol
25cd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25ce0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
25cf0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   of the column i
25d00 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
25d10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
25d20 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
25d30 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
25d40 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
25d50 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
25d60 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68       /* Logarith
25d70 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20  m of table size 
25d80 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
25d90 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20  pTop = 0, *pBtm 
25da0 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20  = 0; /* Top and 
25db0 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e  bottom range con
25dc0 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70  straints */..  p
25dd0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
25de0 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e  pNew;.  if( db->
25df0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
25e00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
25e10 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  EM;..  assert( (
25e20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
25e30 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
25e40 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LE)==0 );.  asse
25e50 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
25e60 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
25e70 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66  IMIT)==0 );.  if
25e80 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
25e90 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
25ea0 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  T ){.    opMask 
25eb0 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_LT|WO_LE;. 
25ec0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62   }else if( pProb
25ed0 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70  e->tnum<=0 || (p
25ee0 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  Src->jointype & 
25ef0 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
25f00 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
25f10 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f  Q|WO_IN|WO_GT|WO
25f20 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  _GE|WO_LT|WO_LE;
25f30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
25f40 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
25f50 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  IN|WO_ISNULL|WO_
25f60 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
25f70 4f 5f 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  O_LE;.  }.  if( 
25f80 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
25f90 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e  ed ) opMask &= ~
25fa0 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  (WO_GT|WO_GE|WO_
25fb0 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73  LT|WO_LE);..  as
25fc0 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74  sert( pNew->u.bt
25fd0 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d  ree.nEq<=pProbe-
25fe0 3e 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 69 66  >nKeyCol );.  if
25ff0 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
26000 6e 45 71 20 3c 20 70 50 72 6f 62 65 2d 3e 6e 4b  nEq < pProbe->nK
26010 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 69 43 6f  eyCol ){.    iCo
26020 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  l = pProbe->aiCo
26030 6c 75 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72  lumn[pNew->u.btr
26040 65 65 2e 6e 45 71 5d 3b 0a 20 20 7d 65 6c 73 65  ee.nEq];.  }else
26050 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b  {.    iCol = -1;
26060 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 77  .  }.  pTerm = w
26070 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63  hereScanInit(&sc
26080 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  an, pBuilder->pW
26090 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  C, pSrc->iCursor
260a0 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  , iCol,.        
260b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260c0 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b  opMask, pProbe);
260d0 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70  .  saved_nEq = p
260e0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
260f0 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20  ;.  saved_nSkip 
26100 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  = pNew->u.btree.
26110 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e  nSkip;.  saved_n
26120 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c  LTerm = pNew->nL
26130 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73  Term;.  saved_ws
26140 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73  Flags = pNew->ws
26150 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70  Flags;.  saved_p
26160 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72  rereq = pNew->pr
26170 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f  ereq;.  saved_nO
26180 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b  ut = pNew->nOut;
26190 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20  .  pNew->rSetup 
261a0 3d 20 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20  = 0;.  rLogSize 
261b0 3d 20 65 73 74 4c 6f 67 28 70 50 72 6f 62 65 2d  = estLog(pProbe-
261c0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29  >aiRowLogEst[0])
261d0 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72  ;..  /* Consider
261e0 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73 63   using a skip-sc
261f0 61 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  an if there are 
26200 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  no WHERE clause 
26210 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
26220 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74   available for t
26230 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
26240 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ms of the index,
26250 20 61 6e 64 20 69 66 20 74 68 65 20 61 76 65 72   and if the aver
26260 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  age.  ** number 
26270 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20 74 68  of repeats in th
26280 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  e left-most term
26290 73 20 69 73 20 61 74 20 6c 65 61 73 74 20 31 38  s is at least 18
262a0 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
262b0 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31 38   magic number 18
262c0 20 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e 20   is selected on 
262d0 74 68 65 20 62 61 73 69 73 20 74 68 61 74 20 73  the basis that s
262e0 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a  canning 17 rows.
262f0 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61    ** is almost a
26300 6c 77 61 79 73 20 71 75 69 63 6b 65 72 20 74 68  lways quicker th
26310 61 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65 6b  an an index seek
26320 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 66   (even though if
26330 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
26340 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74  contains fewer t
26350 68 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77 65  han 2^17 rows we
26360 20 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69 73   assume otherwis
26370 65 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74 73  e in other parts
26380 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64   of.  ** the cod
26390 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69 66  e). And, even if
263a0 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 73   it is not, it s
263b0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f  hould not be too
263c0 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20   much slower. . 
263d0 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
263e0 20 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72 61   hand, the extra
263f0 20 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64   seeks could end
26400 20 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69 66   up being signif
26410 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72  icantly.  ** mor
26420 65 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f  e expensive.  */
26430 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d 73  .  assert( 42==s
26440 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38 29  qlite3LogEst(18)
26450 20 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 3d   );.  if( pTerm=
26460 3d 30 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e  =0.   && saved_n
26470 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a  Eq==saved_nSkip.
26480 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b     && saved_nEq+
26490 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  1<pProbe->nKeyCo
264a0 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  l.   && pProbe->
264b0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
264c0 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a  d_nEq+1]>=42  /*
264d0 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d   TUNING: Minimum
264e0 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a   for skip-scan *
264f0 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77 68  /.   && (rc = wh
26500 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
26510 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
26520 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45  Term+1))==SQLITE
26530 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67  _OK.  ){.    Log
26540 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70  Est nIter;.    p
26550 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
26560 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ++;.    pNew->u.
26570 62 74 72 65 65 2e 6e 53 6b 69 70 2b 2b 3b 0a 20  btree.nSkip++;. 
26580 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
26590 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
265a0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  = 0;.    pNew->w
265b0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
265c0 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49  SKIPSCAN;.    nI
265d0 74 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ter = pProbe->ai
265e0 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
265f0 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61  nEq] - pProbe->a
26600 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
26610 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 70 4e 65  _nEq+1];.    pNe
26620 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 74 65 72  w->nOut -= nIter
26630 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41  ;.    whereLoopA
26640 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
26650 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
26660 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e  obe, nIter + nIn
26670 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Mul);.    pNew->
26680 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
26690 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20 72  t;.  }.  for(; r
266a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
266b0 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20  pTerm!=0; pTerm 
266c0 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  = whereScanNext(
266d0 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36  &scan)){.    u16
266e0 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f   eOp = pTerm->eO
266f0 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68  perator;   /* Sh
26700 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72  orthand for pTer
26710 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  m->eOperator */.
26720 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74      LogEst rCost
26730 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20  Idx;.    LogEst 
26740 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20  nOutUnadjusted; 
26750 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62         /* nOut b
26760 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57  efore IN() and W
26770 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73  HERE adjustments
26780 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20   */.    int nIn 
26790 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
267a0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
267b0 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74  OR_STAT4.    int
267c0 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75   nRecValid = pBu
267d0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
267e0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
267f0 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   (eOp==WO_ISNULL
26800 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c   || (pTerm->wtFl
26810 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21  ags&TERM_VNULL)!
26820 3d 30 29 0a 20 20 20 20 20 26 26 20 28 69 43 6f  =0).     && (iCo
26830 6c 3c 30 20 7c 7c 20 70 53 72 63 2d 3e 70 54 61  l<0 || pSrc->pTa
26840 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f  b->aCol[iCol].no
26850 74 4e 75 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20  tNull).    ){.  
26860 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a      continue; /*
26870 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d   ignore IS [NOT]
26880 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
26890 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  s on NOT NULL co
268a0 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  lumns */.    }. 
268b0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
268c0 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77  ereqRight & pNew
268d0 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e  ->maskSelf ) con
268e0 74 69 6e 75 65 3b 0a 0a 20 20 20 20 70 4e 65 77  tinue;..    pNew
268f0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
26900 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  d_wsFlags;.    p
26910 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
26920 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
26930 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
26940 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20   saved_nLTerm;. 
26950 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
26960 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
26970 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
26980 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d   ) break; /* OOM
26990 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c   */.    pNew->aL
269a0 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
269b0 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m++] = pTerm;.  
269c0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
269d0 20 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c   (saved_prereq |
269e0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
269f0 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61  ght) & ~pNew->ma
26a00 73 6b 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73  skSelf;..    ass
26a10 65 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20  ert( nInMul==0. 
26a20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d         || (pNew-
26a30 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
26a40 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30  _COLUMN_NULL)!=0
26a50 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e   .        || (pN
26a60 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
26a70 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d  ERE_COLUMN_IN)!=
26a80 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70  0 .        || (p
26a90 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
26aa0 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d  HERE_SKIPSCAN)!=
26ab0 30 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69  0 .    );..    i
26ac0 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29  f( eOp & WO_IN )
26ad0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
26ae0 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
26af0 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  pr;.      pNew->
26b00 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
26b10 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20  _COLUMN_IN;.    
26b20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
26b30 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
26b40 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
26b50 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
26b60 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54  SELECT ...)":  T
26b70 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43  UNING: the SELEC
26b80 54 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77  T returns 25 row
26b90 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e  s */.        nIn
26ba0 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20   = 46;  assert( 
26bb0 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  46==sqlite3LogEs
26bc0 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d  t(25) );.      }
26bd0 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
26be0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26  pExpr->x.pList &
26bf0 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
26c00 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
26c10 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61      /* "x IN (va
26c20 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
26c30 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e  " */.        nIn
26c40 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
26c50 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
26c60 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >nExpr);.      }
26c70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
26c80 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53 20  In>0 );  /* RHS 
26c90 61 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72 20  always has 2 or 
26ca0 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54  more terms...  T
26cb0 68 65 20 70 61 72 73 65 72 0a 20 20 20 20 20 20  he parser.      
26cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cd0 20 20 2a 2a 20 63 68 61 6e 67 65 73 20 22 78 20    ** changes "x 
26ce0 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20 22 78 3d  IN (?)" into "x=
26cf0 3f 22 2e 20 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73  ?". */..    }els
26d00 65 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f  e if( eOp & (WO_
26d10 45 51 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  EQ) ){.      pNe
26d20 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
26d30 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20  ERE_COLUMN_EQ;. 
26d40 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
26d50 7c 7c 20 28 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26  || (nInMul==0 &&
26d60 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
26d70 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  Eq==pProbe->nKey
26d80 43 6f 6c 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  Col-1) ){.      
26d90 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
26da0 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72   pProbe->onError
26db0 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20  ==OE_None ){.   
26dc0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
26dd0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e  lags |= WHERE_UN
26de0 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20 20 20  Q_WANTED;.      
26df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26e00 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
26e10 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57   |= WHERE_ONEROW
26e20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26e30 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
26e40 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
26e50 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  L ){.      pNew-
26e60 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
26e70 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20  E_COLUMN_NULL;. 
26e80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70     }else if( eOp
26e90 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
26ea0 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
26eb0 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 54 20  se( eOp & WO_GT 
26ec0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
26ed0 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45 20 29  e( eOp & WO_GE )
26ee0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
26ef0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
26f00 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
26f10 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
26f20 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b     pBtm = pTerm;
26f30 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b  .      pTop = 0;
26f40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26f50 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20    assert( eOp & 
26f60 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b  (WO_LT|WO_LE) );
26f70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26f80 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a   eOp & WO_LT );.
26f90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26fa0 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  eOp & WO_LE );. 
26fb0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
26fc0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
26fd0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54  MN_RANGE|WHERE_T
26fe0 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
26ff0 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pTop = pTerm;.  
27000 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77      pBtm = (pNew
27010 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
27020 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20  E_BTM_LIMIT)!=0 
27030 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
27040 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
27050 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
27060 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a  -2] : 0;.    }..
27070 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
27080 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  oint pNew->nOut 
27090 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
270a0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70  mber of rows exp
270b0 65 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  ected to.    ** 
270c0 62 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68  be visited by th
270d0 65 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66  e index scan bef
270e0 6f 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  ore considering 
270f0 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74  term pTerm, or t
27100 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  he.    ** values
27110 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d   of nIn and nInM
27120 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ul. In other wor
27130 64 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  ds, assuming tha
27140 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78  t all .    ** "x
27150 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20   IN(...)" terms 
27160 61 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74  are replaced wit
27170 68 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20  h "x = ?". This 
27180 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20  block updates.  
27190 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
271a0 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20  f pNew->nOut to 
271b0 61 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72  account for pTer
271c0 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e  m (but not nIn/n
271d0 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20  InMul).  */.    
271e0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
271f0 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
27200 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  ;.    if( pNew->
27210 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
27220 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
27230 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
27240 6e 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 33  nOut using stat3
27250 2f 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c  /stat4 data. Or,
27260 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
27270 73 74 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20  stat3/stat4.    
27280 20 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67    ** data, using
27290 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69   some other esti
272a0 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  mate.  */.      
272b0 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
272c0 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
272d0 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20  er, pBtm, pTop, 
272e0 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pNew);.    }else
272f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20  {.      int nEq 
27300 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65  = ++pNew->u.btre
27310 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73  e.nEq;.      ass
27320 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49  ert( eOp & (WO_I
27330 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49  SNULL|WO_EQ|WO_I
27340 4e 29 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  N) );..      ass
27350 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d  ert( pNew->nOut=
27360 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20  =saved_nOut );. 
27370 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
27380 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 26 26 20  truthProb<=0 && 
27390 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
273a0 20 20 20 61 73 73 65 72 74 28 20 28 65 4f 70 20     assert( (eOp 
273b0 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d  & WO_IN) || nIn=
273c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
273d0 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
273e0 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _IN );.        p
273f0 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65  New->nOut += pTe
27400 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
27410 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
27420 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20  t -= nIn;.      
27430 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
27440 7c 3d 20 57 48 45 52 45 5f 4c 49 4b 45 4c 49 48  |= WHERE_LIKELIH
27450 4f 4f 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  OOD;.      }else
27460 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
27470 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
27480 53 54 41 54 34 0a 20 20 20 20 20 20 20 20 74 52  STAT4.        tR
27490 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a  owcnt nOut = 0;.
274a0 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 6e 4d          if( nInM
274b0 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ul==0 .         
274c0 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70  && pProbe->nSamp
274d0 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  le .         && 
274e0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
274f0 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70  q<=pProbe->nSamp
27500 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20 20 26  leCol.         &
27510 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
27520 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
27530 5f 53 74 61 74 33 29 20 0a 20 20 20 20 20 20 20  _Stat3) .       
27540 20 20 26 26 20 28 28 65 4f 70 20 26 20 57 4f 5f    && ((eOp & WO_
27550 49 4e 29 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48  IN)==0 || !ExprH
27560 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
27570 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
27580 65 6c 65 63 74 29 29 0a 20 20 20 20 20 20 20 20  elect)).        
27590 20 26 26 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   && (pNew->wsFla
275a0 67 73 20 26 20 57 48 45 52 45 5f 4c 49 4b 45 4c  gs & WHERE_LIKEL
275b0 49 48 4f 4f 44 29 3d 3d 30 0a 20 20 20 20 20 20  IHOOD)==0.      
275c0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45    ){.          E
275d0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
275e0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
275f0 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26 20       if( (eOp & 
27600 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
27610 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
27620 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
27630 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  Op & WO_EQ );.  
27640 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
27650 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  se( eOp & WO_ISN
27660 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ULL );.         
27670 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
27680 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
27690 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70  , pBuilder, pExp
276a0 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74  r->pRight, &nOut
276b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
276c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
276d0 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e  rc = whereInScan
276e0 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69  Est(pParse, pBui
276f0 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70  lder, pExpr->x.p
27700 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20  List, &nOut);.  
27710 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27720 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
27730 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 4f 75  SQLITE_OK || nOu
27740 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  t>0 );.         
27750 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27760 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20  NOTFOUND ) rc = 
27770 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
27780 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
27790 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20  ITE_OK ) break; 
277a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
277b0 20 6f 75 74 20 6f 66 20 74 68 65 20 70 54 65 72   out of the pTer
277c0 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  m loop */.      
277d0 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a      if( nOut ){.
277e0 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
277f0 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ->nOut = sqlite3
27800 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20  LogEst(nOut);.  
27810 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
27820 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e  ew->nOut>saved_n
27830 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74  Out ) pNew->nOut
27840 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20   = saved_nOut;. 
27850 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
27860 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20  >nOut -= nIn;.  
27870 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27880 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
27890 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66  nOut==0 ).#endif
278a0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
278b0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
278c0 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f  += (pProbe->aiRo
278d0 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70  wLogEst[nEq] - p
278e0 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
278f0 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20  st[nEq-1]);.    
27900 20 20 20 20 20 20 69 66 28 20 65 4f 70 20 26 20        if( eOp & 
27910 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
27920 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49           /* TUNI
27930 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69 73 20  NG: If there is 
27940 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20  no likelihood() 
27950 76 61 6c 75 65 2c 20 61 73 73 75 6d 65 20 74 68  value, assume th
27960 61 74 20 61 20 0a 20 20 20 20 20 20 20 20 20 20  at a .          
27970 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c    ** "col IS NUL
27980 4c 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  L" expression ma
27990 74 63 68 65 73 20 74 77 69 63 65 20 61 73 20 6d  tches twice as m
279a0 61 6e 79 20 72 6f 77 73 20 0a 20 20 20 20 20 20  any rows .      
279b0 20 20 20 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c        ** as (col
279c0 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  =?). */.        
279d0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
279e0 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20  = 10;.          
279f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
27a00 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
27a10 2a 20 53 65 74 20 72 43 6f 73 74 49 64 78 20 74  * Set rCostIdx t
27a20 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69  o the cost of vi
27a30 73 69 74 69 6e 67 20 73 65 6c 65 63 74 65 64 20  siting selected 
27a40 72 6f 77 73 20 69 6e 20 69 6e 64 65 78 2e 20 41  rows in index. A
27a50 64 64 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f 20  dd.    ** it to 
27a60 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63  pNew->rRun, whic
27a70 68 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73  h is currently s
27a80 65 74 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f  et to the cost o
27a90 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  f the index.    
27aa0 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68  ** seek only. Th
27ab0 65 6e 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  en, if this is a
27ac0 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
27ad0 64 65 78 2c 20 61 64 64 20 74 68 65 20 63 6f 73  dex, add the cos
27ae0 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73 69  t of.    ** visi
27af0 74 69 6e 67 20 74 68 65 20 72 6f 77 73 20 69 6e  ting the rows in
27b00 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
27b10 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49 64    */.    rCostId
27b20 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b  x = pNew->nOut +
27b30 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d   1 + (15*pProbe-
27b40 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53 72 63 2d  >szIdxRow)/pSrc-
27b50 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b  >pTab->szTabRow;
27b60 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  .    pNew->rRun 
27b70 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
27b80 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f  dd(rLogSize, rCo
27b90 73 74 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20  stIdx);.    if( 
27ba0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
27bb0 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
27bc0 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20  |WHERE_IPK))==0 
27bd0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  ){.      pNew->r
27be0 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
27bf0 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  EstAdd(pNew->rRu
27c00 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20  n, pNew->nOut + 
27c10 31 36 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  16);.    }..    
27c20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 20 3d  nOutUnadjusted =
27c30 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20   pNew->nOut;.   
27c40 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e   pNew->rRun += n
27c50 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20  InMul + nIn;.   
27c60 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e   pNew->nOut += n
27c70 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20  InMul + nIn;.   
27c80 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
27c90 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72 2d  Adjust(pBuilder-
27ca0 3e 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20 20  >pWC, pNew);.   
27cb0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
27cc0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
27cd0 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  pNew);..    if( 
27ce0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
27cf0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
27d00 47 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  GE ){.      pNew
27d10 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
27d20 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Out;.    }else{.
27d30 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
27d40 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65   = nOutUnadjuste
27d50 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  d;.    }..    if
27d60 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
27d70 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
27d80 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  IT)==0.     && p
27d90 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
27da0 3c 28 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  <(pProbe->nKeyCo
27db0 6c 20 2b 20 28 70 50 72 6f 62 65 2d 3e 7a 4e 61  l + (pProbe->zNa
27dc0 6d 65 21 3d 30 29 29 0a 20 20 20 20 29 7b 0a 20  me!=0)).    ){. 
27dd0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64       whereLoopAd
27de0 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
27df0 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
27e00 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b  be, nInMul+nIn);
27e10 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d  .    }.    pNew-
27e20 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
27e30 75 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ut;.#ifdef SQLIT
27e40 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
27e50 52 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75 69  R_STAT4.    pBui
27e60 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
27e70 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e  = nRecValid;.#en
27e80 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  dif.  }.  pNew->
27e90 70 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f 70  prereq = saved_p
27ea0 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75  rereq;.  pNew->u
27eb0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
27ec0 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e  ed_nEq;.  pNew->
27ed0 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20  u.btree.nSkip = 
27ee0 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70  saved_nSkip;.  p
27ef0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
27f00 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
27f10 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
27f20 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d  ed_nOut;.  pNew-
27f30 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f  >nLTerm = saved_
27f40 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e  nLTerm;.  return
27f50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
27f60 74 75 72 6e 20 54 72 75 65 20 69 66 20 69 74 20  turn True if it 
27f70 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
27f80 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65   pIndex might be
27f90 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d   useful in.** im
27fa0 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f  plementing the O
27fb0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
27fc0 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a  n pBuilder..**.*
27fd0 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69  * Return False i
27fe0 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20  f pBuilder does 
27ff0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f  not contain an O
28000 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
28010 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
28020 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64   no way for pInd
28030 65 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20  ex to be useful 
28040 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  in implementing 
28050 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59  that.** ORDER BY
28060 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
28070 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68  ic int indexMigh
28080 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79  tHelpWithOrderBy
28090 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
280a0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
280b0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
280c0 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29  .  int iCursor.)
280d0 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
280e0 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  B;.  int ii, jj;
280f0 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  ..  if( pIndex->
28100 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74  bUnordered ) ret
28110 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f  urn 0;.  if( (pO
28120 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  B = pBuilder->pW
28130 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d  Info->pOrderBy)=
28140 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
28150 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
28160 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  B->nExpr; ii++){
28170 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
28180 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
28190 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61  ipCollate(pOB->a
281a0 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  [ii].pExpr);.   
281b0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
281c0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
281d0 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 45  rn 0;.    if( pE
281e0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75  xpr->iTable==iCu
281f0 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 66 6f  rsor ){.      fo
28200 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65  r(jj=0; jj<pInde
28210 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b  x->nKeyCol; jj++
28220 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
28230 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
28240 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
28250 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  jj] ) return 1;.
28260 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28270 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
28280 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
28290 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73  bitmask where 1s
282a0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
282b0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
282c0 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
282d0 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64 20  e table is used 
282e0 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e  by an index.  On
282f0 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33 20  ly the first 63 
28300 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73  columns are cons
28310 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idered..*/.stati
28320 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e  c Bitmask column
28330 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  sInIndex(Index *
28340 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b  pIdx){.  Bitmask
28350 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b   m = 0;.  int j;
28360 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e  .  for(j=pIdx->n
28370 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20  Column-1; j>=0; 
28380 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  j--){.    int x 
28390 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
283a0 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d  [j];.    if( x>=
283b0 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
283c0 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b  ase( x==BMS-1 );
283d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
283e0 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20   x==BMS-2 );.   
283f0 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
28400 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29   m |= MASKBIT(x)
28410 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
28420 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68  turn m;.}../* Ch
28430 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20  eck to see if a 
28440 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77 69  partial index wi
28450 74 68 20 70 50 61 72 74 49 6e 64 65 78 57 68 65  th pPartIndexWhe
28460 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a  re can be used.*
28470 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * in the current
28480 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20   query.  Return 
28490 74 72 75 65 20 69 66 20 69 74 20 63 61 6e 20 62  true if it can b
284a0 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e  e and false if n
284b0 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
284c0 74 20 77 68 65 72 65 55 73 61 62 6c 65 50 61 72  t whereUsablePar
284d0 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69 54  tialIndex(int iT
284e0 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20  ab, WhereClause 
284f0 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68 65  *pWC, Expr *pWhe
28500 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  re){.  int i;.  
28510 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
28520 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65  ;.  for(i=0, pTe
28530 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
28540 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
28550 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
28560 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
28570 65 73 45 78 70 72 28 70 54 65 72 6d 2d 3e 70 45  esExpr(pTerm->pE
28580 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61  xpr, pWhere, iTa
28590 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  b) ) return 1;. 
285a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
285b0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
285c0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
285d0 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
285e0 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
285f0 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65   where the table
28600 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69 65 64 20  .** is idenfied 
28610 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  by pBuilder->pNe
28620 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
28630 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
28640 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d  ed to be.** a b-
28650 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  tree table, not 
28660 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
28670 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73  .**.** The costs
28680 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e   (WhereLoop.rRun
28690 29 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  ) of the b-tree 
286a0 6c 6f 6f 70 73 20 61 64 64 65 64 20 62 79 20 74  loops added by t
286b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
286c0 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 20 61  are calculated a
286d0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
286e0 20 46 6f 72 20 61 20 66 75 6c 6c 20 73 63 61 6e   For a full scan
286f0 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20 74  , assuming the t
28700 61 62 6c 65 20 28 6f 72 20 69 6e 64 65 78 29 20  able (or index) 
28710 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f  contains nRow ro
28720 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f  ws:.**.**     co
28730 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20  st = nRow * 3.0 
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28750 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65     // full-table
28760 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73   scan.**     cos
28770 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20  t = nRow * K    
28780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28790 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76    // scan of cov
287a0 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20  ering index.**  
287b0 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
287c0 20 28 4b 2b 33 2e 30 29 20 20 20 20 20 20 20 20   (K+3.0)        
287d0 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20          // scan 
287e0 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20  of non-covering 
287f0 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72  index.**.** wher
28800 65 20 4b 20 69 73 20 61 20 76 61 6c 75 65 20 62  e K is a value b
28810 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33  etween 1.1 and 3
28820 2e 30 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  .0 set based on 
28830 74 68 65 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a  the relative .**
28840 20 65 73 74 69 6d 61 74 65 64 20 61 76 65 72 61   estimated avera
28850 67 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  ge size of the i
28860 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72  ndex and table r
28870 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ecords..**.** Fo
28880 72 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c  r an index scan,
28890 20 77 68 65 72 65 20 6e 56 69 73 69 74 20 69 73   where nVisit is
288a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
288b0 6e 64 65 78 20 72 6f 77 73 20 76 69 73 69 74 65  ndex rows visite
288c0 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 63 61 6e  d.** by the scan
288d0 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69 73 20 74  , and nSeek is t
288e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 65  he number of see
288f0 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71  k operations req
28900 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65  uired on .** the
28910 20 69 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a   index b-tree:.*
28920 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  *.**     cost = 
28930 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f  nSeek * (log(nRo
28940 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29  w) + K * nVisit)
28950 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 76            // cov
28960 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20  ering index.**  
28970 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20     cost = nSeek 
28980 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28  * (log(nRow) + (
28990 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69 74 29  K+3.0) * nVisit)
289a0 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72      // non-cover
289b0 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20  ing index.**.** 
289c0 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20  Normally, nSeek 
289d0 69 73 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75  is 1. nSeek valu
289e0 65 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  es greater than 
289f0 31 20 63 6f 6d 65 20 61 62 6f 75 74 20 69 66 20  1 come about if 
28a00 74 68 65 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c  the .** WHERE cl
28a10 61 75 73 65 20 69 6e 63 6c 75 64 65 73 20 22 78  ause includes "x
28a20 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d   IN (....)" term
28a30 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  s used in place 
28a40 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65  of "x=?". Or whe
28a50 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22  n .** implicit "
28a60 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46  x IN (SELECT x F
28a70 52 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d 73 20  ROM tbl)" terms 
28a80 61 72 65 20 61 64 64 65 64 20 66 6f 72 20 73 6b  are added for sk
28a90 69 70 2d 73 63 61 6e 73 2e 0a 2a 2f 0a 73 74 61  ip-scans..*/.sta
28aa0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
28ab0 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65  pAddBtree(.  Whe
28ac0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
28ad0 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52  Builder, /* WHER
28ae0 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
28af0 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
28b00 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20  k mExtra        
28b10 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70        /* Extra p
28b20 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72  rerequesites for
28b30 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c   using this tabl
28b40 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  e */.){.  WhereI
28b50 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
28b60 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
28b70 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
28b80 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
28b90 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
28ba0 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20   /* An index we 
28bb0 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a  are evaluating *
28bc0 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20  /.  Index sPk;  
28bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28be0 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20  /* A fake index 
28bf0 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70  object for the p
28c00 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
28c10 4c 6f 67 45 73 74 20 61 69 52 6f 77 45 73 74 50  LogEst aiRowEstP
28c20 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54  k[2];       /* T
28c30 68 65 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d  he aiRowLogEst[]
28c40 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
28c50 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31  Pk index */.  i1
28c60 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d  6 aiColumnPk = -
28c70 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  1;        /* The
28c80 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65   aColumn[] value
28c90 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64   for the sPk ind
28ca0 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ex */.  SrcList 
28cb0 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20  *pTabList;      
28cc0 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
28cd0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
28ce0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
28cf0 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46  *pSrc;  /* The F
28d00 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65  ROM clause btree
28d10 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a   term to add */.
28d20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
28d30 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w;            /*
28d40 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
28d50 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
28d60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
28d70 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52  OK;         /* R
28d80 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
28d90 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31  int iSortIdx = 1
28da0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
28db0 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
28dc0 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20   int b;         
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28de0 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20  A boolean value 
28df0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a  */.  LogEst rSiz
28e00 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
28e10 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f   /* number of ro
28e20 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
28e30 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
28e40 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
28e50 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66   /* Logarithm of
28e60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
28e70 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
28e80 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
28e90 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
28ea0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20    /* The parsed 
28eb0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
28ec0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
28ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28ee0 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   Table being que
28ef0 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65  ried */.  .  pNe
28f00 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
28f10 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70  ew;.  pWInfo = p
28f20 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
28f30 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57  .  pTabList = pW
28f40 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
28f50 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73    pSrc = pTabLis
28f60 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
28f70 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  b;.  pTab = pSrc
28f80 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20  ->pTab;.  pWC = 
28f90 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
28fa0 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74   assert( !IsVirt
28fb0 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20  ual(pSrc->pTab) 
28fc0 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  );..  if( pSrc->
28fd0 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a  pIndex ){.    /*
28fe0 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   An INDEXED BY c
28ff0 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20  lause specifies 
29000 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
29010 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  ex to use */.   
29020 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
29030 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20  pIndex;.  }else 
29040 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
29050 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62  ab) ){.    pProb
29060 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  e = pTab->pIndex
29070 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
29080 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
29090 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
290a0 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
290b0 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
290c0 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
290d0 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70  iable sPk to rep
290e0 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64  resent the rowid
290f0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
29100 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20  ex.  Make this. 
29110 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78     ** fake index
29120 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
29130 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f  chain of Index o
29140 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20  bjects with all 
29150 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20  of the real.    
29160 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f  ** indices to fo
29170 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65  llow */.    Inde
29180 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  x *pFirst;      
29190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
291a0 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64  irst of real ind
291b0 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
291c0 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  e */.    memset(
291d0 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sPk, 0, sizeof(
291e0 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b  Index));.    sPk
291f0 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20  .nKeyCol = 1;.  
29200 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d    sPk.aiColumn =
29210 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20   &aiColumnPk;.  
29220 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67 45 73    sPk.aiRowLogEs
29230 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a  t = aiRowEstPk;.
29240 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20      sPk.onError 
29250 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20  = OE_Replace;.  
29260 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70    sPk.pTable = p
29270 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73 7a 49  Tab;.    sPk.szI
29280 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e 73 7a  dxRow = pTab->sz
29290 54 61 62 52 6f 77 3b 0a 20 20 20 20 61 69 52 6f  TabRow;.    aiRo
292a0 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62  wEstPk[0] = pTab
292b0 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  ->nRowLogEst;.  
292c0 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20    aiRowEstPk[1] 
292d0 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73 74 20  = 0;.    pFirst 
292e0 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49  = pSrc->pTab->pI
292f0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53  ndex;.    if( pS
29300 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  rc->notIndexed==
29310 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
29320 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f  e real indices o
29330 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  f the table are 
29340 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20  only considered 
29350 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  if the.      ** 
29360 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c  NOT INDEXED qual
29370 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64  ifier is omitted
29380 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63   from the FROM c
29390 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73  lause */.      s
293a0 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73  Pk.pNext = pFirs
293b0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72  t;.    }.    pPr
293c0 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a  obe = &sPk;.  }.
293d0 20 20 72 53 69 7a 65 20 3d 20 70 54 61 62 2d 3e    rSize = pTab->
293e0 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 72 4c  nRowLogEst;.  rL
293f0 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28  ogSize = estLog(
29400 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64 65 66  rSize);..#ifndef
29410 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
29420 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 2f  OMATIC_INDEX.  /
29430 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  * Automatic inde
29440 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42  xes */.  if( !pB
29450 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 0a 20  uilder->pOrSet. 
29460 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50    && (pWInfo->pP
29470 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
29480 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64  & SQLITE_AutoInd
29490 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72  ex)!=0.   && pSr
294a0 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  c->pIndex==0.   
294b0 26 26 20 21 70 53 72 63 2d 3e 76 69 61 43 6f 72  && !pSrc->viaCor
294c0 6f 75 74 69 6e 65 0a 20 20 20 26 26 20 21 70 53  outine.   && !pS
294d0 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20  rc->notIndexed. 
294e0 20 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54    && HasRowid(pT
294f0 61 62 29 0a 20 20 20 26 26 20 21 70 53 72 63 2d  ab).   && !pSrc-
29500 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 0a 20 20  >isCorrelated.  
29510 20 26 26 20 21 70 53 72 63 2d 3e 69 73 52 65 63   && !pSrc->isRec
29520 75 72 73 69 76 65 0a 20 20 29 7b 0a 20 20 20 20  ursive.  ){.    
29530 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f  /* Generate auto
29540 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70  -index WhereLoop
29550 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  s */.    WhereTe
29560 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57  rm *pTerm;.    W
29570 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
29580 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d   = pWC->a + pWC-
29590 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28  >nTerm;.    for(
295a0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63  pTerm=pWC->a; rc
295b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
295c0 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
295d0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  rm++){.      if(
295e0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
295f0 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
29600 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
29610 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 43  .      if( termC
29620 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
29630 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a  rm, pSrc, 0) ){.
29640 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
29650 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
29660 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
29670 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a  tree.nSkip = 0;.
29680 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
29690 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
296a0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
296b0 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
296c0 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
296d0 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
296e0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
296f0 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f  One-time cost fo
29700 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20  r computing the 
29710 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
29720 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 70  is.        ** ap
29730 70 72 6f 78 69 6d 61 74 65 6c 79 20 37 2a 4e 2a  proximately 7*N*
29740 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20  log2(N) where N 
29750 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
29760 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20   rows in.       
29770 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
29780 69 6e 67 20 69 6e 64 65 78 65 64 2e 20 2a 2f 0a  ing indexed. */.
29790 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
297a0 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20  etup = rLogSize 
297b0 2b 20 72 53 69 7a 65 20 2b 20 32 38 3b 20 20 61  + rSize + 28;  a
297c0 73 73 65 72 74 28 20 32 38 3d 3d 73 71 6c 69 74  ssert( 28==sqlit
297d0 65 33 4c 6f 67 45 73 74 28 37 29 20 29 3b 0a 20  e3LogEst(7) );. 
297e0 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
297f0 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f  : Each index loo
29800 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20 72 6f  kup yields 20 ro
29810 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
29820 20 20 54 68 69 73 0a 20 20 20 20 20 20 20 20 2a    This.        *
29830 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 74  * is more than t
29840 68 65 20 75 73 75 61 6c 20 67 75 65 73 73 20 6f  he usual guess o
29850 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e 63 65  f 10 rows, since
29860 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61 79 0a   we have no way.
29870 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e          ** of kn
29880 6f 77 6e 69 6e 67 20 68 6f 77 20 73 65 6c 65 63  owning how selec
29890 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 77  tive the index w
298a0 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
298b0 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20  e.  It would.   
298c0 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75       ** not be u
298d0 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d  nreasonable to m
298e0 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d  ake this value m
298f0 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20  uch larger. */. 
29900 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
29910 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28  t = 43;  assert(
29920 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   43==sqlite3LogE
29930 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20  st(20) );.      
29940 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
29950 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
29960 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e  rLogSize,pNew->n
29970 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  Out);.        pN
29980 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
29990 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a  ERE_AUTO_INDEX;.
299a0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
299b0 65 72 65 71 20 3d 20 6d 45 78 74 72 61 20 7c 20  ereq = mExtra | 
299c0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
299d0 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
299e0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
299f0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
29a00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29a10 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
29a20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
29a30 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20  TIC_INDEX */..  
29a40 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  /* Loop over all
29a50 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20   indices.  */.  
29a60 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45  for(; rc==SQLITE
29a70 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70  _OK && pProbe; p
29a80 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e  Probe=pProbe->pN
29a90 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29  ext, iSortIdx++)
29aa0 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65  {.    if( pProbe
29ab0 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
29ac0 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68 65 72  =0.     && !wher
29ad0 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e  eUsablePartialIn
29ae0 64 65 78 28 70 4e 65 77 2d 3e 69 54 61 62 2c 20  dex(pNew->iTab, 
29af0 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61  pWC, pProbe->pPa
29b00 72 74 49 64 78 57 68 65 72 65 29 20 29 7b 0a 20  rtIdxWhere) ){. 
29b10 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
29b20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78  /* Partial index
29b30 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66   inappropriate f
29b40 6f 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  or this query */
29b50 0a 20 20 20 20 7d 0a 20 20 20 20 72 53 69 7a 65  .    }.    rSize
29b60 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
29b70 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70  LogEst[0];.    p
29b80 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
29b90 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
29ba0 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20  u.btree.nSkip = 
29bb0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  0;.    pNew->nLT
29bc0 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  erm = 0;.    pNe
29bd0 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
29be0 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  .    pNew->rSetu
29bf0 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  p = 0;.    pNew-
29c00 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
29c10 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
29c20 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e   = rSize;.    pN
29c30 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
29c40 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20  ex = pProbe;.   
29c50 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74 48   b = indexMightH
29c60 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 70  elpWithOrderBy(p
29c70 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c  Builder, pProbe,
29c80 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b   pSrc->iCursor);
29c90 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50  .    /* The ONEP
29ca0 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61 67  ASS_DESIRED flag
29cb0 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20 74  s never occurs t
29cc0 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f 52 44  ogether with ORD
29cd0 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73 73  ER BY */.    ass
29ce0 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63  ert( (pWInfo->wc
29cf0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
29d00 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
29d10 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a  )==0 || b==0 );.
29d20 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
29d30 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20  tnum<=0 ){.     
29d40 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69 6d   /* Integer prim
29d50 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f  ary key index */
29d60 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
29d70 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50 4b  lags = WHERE_IPK
29d80 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c  ;..      /* Full
29d90 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20   table scan */. 
29da0 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
29db0 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49  Idx = b ? iSortI
29dc0 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f 2a  dx : 0;.      /*
29dd0 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
29de0 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
29df0 20 69 73 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a   is (N*3.0). */.
29e00 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
29e10 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 0a 20   = rSize + 16;. 
29e20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
29e30 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
29e40 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 63 20  pNew);.      rc 
29e50 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
29e60 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
29e70 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  );.      pNew->n
29e80 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20  Out = rSize;.   
29e90 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
29ea0 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
29eb0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20      Bitmask m;. 
29ec0 20 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d       if( pProbe-
29ed0 3e 69 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20  >isCovering ){. 
29ee0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
29ef0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 44 58  lags = WHERE_IDX
29f00 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e  _ONLY | WHERE_IN
29f10 44 45 58 45 44 3b 0a 20 20 20 20 20 20 20 20 6d  DEXED;.        m
29f20 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
29f30 65 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 70  e{.        m = p
29f40 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e  Src->colUsed & ~
29f50 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70  columnsInIndex(p
29f60 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 20 20  Probe);.        
29f70 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
29f80 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f  (m==0) ? (WHERE_
29f90 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49  IDX_ONLY|WHERE_I
29fa0 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f  NDEXED) : WHERE_
29fb0 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 7d  INDEXED;.      }
29fc0 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  ..      /* Full 
29fd0 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a  scan via index *
29fe0 2f 0a 20 20 20 20 20 20 69 66 28 20 62 0a 20 20  /.      if( b.  
29ff0 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69       || !HasRowi
2a000 64 28 70 54 61 62 29 0a 20 20 20 20 20 20 20 7c  d(pTab).       |
2a010 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20  | ( m==0.       
2a020 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e    && pProbe->bUn
2a030 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20  ordered==0.     
2a040 20 20 20 20 26 26 20 28 70 50 72 6f 62 65 2d 3e      && (pProbe->
2a050 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73  szIdxRow<pTab->s
2a060 7a 54 61 62 52 6f 77 29 0a 20 20 20 20 20 20 20  zTabRow).       
2a070 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
2a080 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2a090 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
2a0a0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
2a0b0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2a0c0 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20  nfig.bUseCis.   
2a0d0 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
2a0e0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49  ationEnabled(pWI
2a0f0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  nfo->pParse->db,
2a100 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78   SQLITE_CoverIdx
2a110 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20  Scan).          
2a120 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2a130 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
2a140 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78  x = b ? iSortIdx
2a150 20 3a 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f   : 0;..        /
2a160 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 76 69  * The cost of vi
2a170 73 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78  siting the index
2a180 20 72 6f 77 73 20 69 73 20 4e 2a 4b 2c 20 77 68   rows is N*K, wh
2a190 65 72 65 20 4b 20 69 73 0a 20 20 20 20 20 20 20  ere K is.       
2a1a0 20 2a 2a 20 62 65 74 77 65 65 6e 20 31 2e 31 20   ** between 1.1 
2a1b0 61 6e 64 20 33 2e 30 2c 20 64 65 70 65 6e 64 69  and 3.0, dependi
2a1c0 6e 67 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69  ng on the relati
2a1d0 76 65 20 73 69 7a 65 73 20 6f 66 20 74 68 65 0a  ve sizes of the.
2a1e0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
2a1f0 20 61 6e 64 20 74 61 62 6c 65 20 72 6f 77 73 2e   and table rows.
2a200 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f   If this is a no
2a210 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
2a220 20 73 63 61 6e 2c 0a 20 20 20 20 20 20 20 20 2a   scan,.        *
2a230 2a 20 61 6c 73 6f 20 61 64 64 20 74 68 65 20 63  * also add the c
2a240 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20  ost of visiting 
2a250 74 61 62 6c 65 20 72 6f 77 73 20 28 4e 2a 33 2e  table rows (N*3.
2a260 30 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  0).  */.        
2a270 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69  pNew->rRun = rSi
2a280 7a 65 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72  ze + 1 + (15*pPr
2a290 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70  obe->szIdxRow)/p
2a2a0 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
2a2b0 20 20 20 20 20 20 20 69 66 28 20 6d 21 3d 30 20         if( m!=0 
2a2c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
2a2d0 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
2a2e0 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d  3LogEstAdd(pNew-
2a2f0 3e 72 52 75 6e 2c 20 72 53 69 7a 65 2b 31 36 29  >rRun, rSize+16)
2a300 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
2a310 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
2a320 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
2a330 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 72  pNew);.        r
2a340 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2a350 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2a360 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ew);.        pNe
2a370 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
2a380 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
2a390 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
2a3a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
2a3b0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
2a3c0 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72  eeIndex(pBuilder
2a3d0 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20  , pSrc, pProbe, 
2a3e0 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0);.#ifdef SQLIT
2a3f0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
2a400 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69  R_STAT4.    sqli
2a410 74 65 33 53 74 61 74 34 50 72 6f 62 65 46 72 65  te3Stat4ProbeFre
2a420 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63  e(pBuilder->pRec
2a430 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  );.    pBuilder-
2a440 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a  >nRecValid = 0;.
2a450 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52      pBuilder->pR
2a460 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ec = 0;.#endif..
2a470 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
2a480 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42  was an INDEXED B
2a490 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f  Y clause, then o
2a4a0 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64  nly that one ind
2a4b0 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ex is.    ** con
2a4c0 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20  sidered. */.    
2a4d0 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  if( pSrc->pIndex
2a4e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
2a4f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
2a500 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2a510 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
2a520 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65  *.** Add all Whe
2a530 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66  reLoop objects f
2a540 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  or a table of th
2a550 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65  e join identifie
2a560 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72  d by.** pBuilder
2a570 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54  ->pNew->iTab.  T
2a580 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61  hat table is gua
2a590 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  ranteed to be a 
2a5a0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
2a5b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
2a5c0 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
2a5d0 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
2a5e0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
2a5f0 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
2a600 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
2a610 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61    Bitmask mExtra
2a620 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
2a630 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
2a640 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c     /* WHERE anal
2a650 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ysis context */.
2a660 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
2a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a680 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
2a690 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
2a6a0 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
2a6b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
2a6c0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2a6d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2a6e0 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a  item *pSrc;   /*
2a6f0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
2a700 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
2a710 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
2a720 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
2a730 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
2a740 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b  _info *pIdxInfo;
2a750 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
2a760 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
2a770 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
2a780 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
2a790 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
2a7a0 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
2a7b0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
2a7c0 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  m;.  int i, j;. 
2a7d0 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54 65   int iTerm, mxTe
2a7e0 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74  rm;.  int nConst
2a7f0 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65  raint;.  int see
2a800 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nIn = 0;        
2a810 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a820 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   an IN operator 
2a830 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  is seen */.  int
2a840 20 73 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20   seenVar = 0;   
2a850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2a860 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74  e if a non-const
2a870 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  ant constraint i
2a880 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  s seen */.  int 
2a890 69 50 68 61 73 65 3b 20 20 20 20 20 20 20 20 20  iPhase;         
2a8a0 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63           /* 0: c
2a8b0 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20  onst w/o IN, 1: 
2a8c0 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c  const, 2: no IN,
2a8d0 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65    2: IN */.  Whe
2a8e0 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
2a8f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a900 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20  OK;..  pWInfo = 
2a910 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
2a920 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ;.  pParse = pWI
2a930 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  nfo->pParse;.  d
2a940 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2a950 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
2a960 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20  ->pWC;.  pNew = 
2a970 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
2a980 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f    pSrc = &pWInfo
2a990 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e  ->pTabList->a[pN
2a9a0 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61  ew->iTab];.  pTa
2a9b0 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  b = pSrc->pTab;.
2a9c0 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74    assert( IsVirt
2a9d0 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70  ual(pTab) );.  p
2a9e0 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61  IdxInfo = alloca
2a9f0 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72  teIndexInfo(pPar
2aa00 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70  se, pWC, pSrc, p
2aa10 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42  Builder->pOrderB
2aa20 79 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  y);.  if( pIdxIn
2aa30 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  fo==0 ) return S
2aa40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70  QLITE_NOMEM;.  p
2aa50 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b  New->prereq = 0;
2aa60 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20  .  pNew->rSetup 
2aa70 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46  = 0;.  pNew->wsF
2aa80 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52  lags = WHERE_VIR
2aa90 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65  TUALTABLE;.  pNe
2aaa0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  w->nLTerm = 0;. 
2aab0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
2aac0 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 70 55  edFree = 0;.  pU
2aad0 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  sage = pIdxInfo-
2aae0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
2aaf0 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  e;.  nConstraint
2ab00 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   = pIdxInfo->nCo
2ab10 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20  nstraint;.  if( 
2ab20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
2ab30 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74  db, pNew, nConst
2ab40 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71  raint) ){.    sq
2ab50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2ab60 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 72  pIdxInfo);.    r
2ab70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2ab80 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69  EM;.  }..  for(i
2ab90 50 68 61 73 65 3d 30 3b 20 69 50 68 61 73 65 3c  Phase=0; iPhase<
2aba0 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20  =3; iPhase++){. 
2abb0 20 20 20 69 66 28 20 21 73 65 65 6e 49 6e 20 26     if( !seenIn &
2abc0 26 20 28 69 50 68 61 73 65 26 31 29 21 3d 30 20  & (iPhase&1)!=0 
2abd0 29 7b 0a 20 20 20 20 20 20 69 50 68 61 73 65 2b  ){.      iPhase+
2abe0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 68  +;.      if( iPh
2abf0 61 73 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20  ase>3 ) break;. 
2ac00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65     }.    if( !se
2ac10 65 6e 56 61 72 20 26 26 20 69 50 68 61 73 65 3e  enVar && iPhase>
2ac20 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  1 ) break;.    p
2ac30 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
2ac40 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
2ac50 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
2ac60 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
2ac70 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  aint;.    for(i=
2ac80 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
2ac90 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
2aca0 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
2acb0 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73      j = pIdxCons
2acc0 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ->iTermOffset;. 
2acd0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
2ace0 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73  C->a[j];.      s
2acf0 77 69 74 63 68 28 20 69 50 68 61 73 65 20 29 7b  witch( iPhase ){
2ad00 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 30 3a  .        case 0:
2ad10 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73      /* Constants
2ad20 20 77 69 74 68 6f 75 74 20 49 4e 20 6f 70 65 72   without IN oper
2ad30 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ator */.        
2ad40 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
2ad50 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  le = 0;.        
2ad60 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
2ad70 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
2ad80 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2ad90 20 20 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20     seenIn = 1;. 
2ada0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2adb0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
2adc0 70 72 65 72 65 71 52 69 67 68 74 21 3d 30 20 29  prereqRight!=0 )
2add0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
2ade0 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20  enVar = 1;.     
2adf0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
2ae00 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2ae10 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a   & WO_IN)==0 ){.
2ae20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
2ae30 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31  Cons->usable = 1
2ae40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2ae50 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2ae60 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20         case 1:  
2ae70 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77    /* Constants w
2ae80 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  ith IN operators
2ae90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
2aea0 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a  sert( seenIn );.
2aeb0 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
2aec0 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54  ns->usable = (pT
2aed0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
2aee0 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ==0);.          
2aef0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
2af00 61 73 65 20 32 3a 20 20 20 20 2f 2a 20 56 61 72  ase 2:    /* Var
2af10 69 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49  iables without I
2af20 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  N */.          a
2af30 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 29  ssert( seenVar )
2af40 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
2af50 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28  Cons->usable = (
2af60 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2af70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20   & WO_IN)==0;.  
2af80 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2af90 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
2afa0 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77    /* Variables w
2afb0 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20  ith IN */.      
2afc0 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e      assert( seen
2afd0 56 61 72 20 26 26 20 73 65 65 6e 49 6e 20 29 3b  Var && seenIn );
2afe0 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
2aff0 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b  ons->usable = 1;
2b000 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2b010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2b020 20 20 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67      memset(pUsag
2b030 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73  e, 0, sizeof(pUs
2b040 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f  age[0])*pIdxInfo
2b050 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  ->nConstraint);.
2b060 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f      if( pIdxInfo
2b070 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2b080 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  tr ) sqlite3_fre
2b090 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  e(pIdxInfo->idxS
2b0a0 74 72 29 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  tr);.    pIdxInf
2b0b0 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20  o->idxStr = 0;. 
2b0c0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
2b0d0 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Num = 0;.    pId
2b0e0 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2b0f0 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
2b100 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
2b110 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
2b120 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73      pIdxInfo->es
2b130 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51  timatedCost = SQ
2b140 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28  LITE_BIG_DBL / (
2b150 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20 70 49  double)2;.    pI
2b160 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
2b170 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 20 20  dRows = 25;.    
2b180 72 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e 64  rc = vtabBestInd
2b190 65 78 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ex(pParse, pTab,
2b1a0 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20   pIdxInfo);.    
2b1b0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
2b1c0 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65  ereLoopAddVtab_e
2b1d0 78 69 74 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  xit;.    pIdxCon
2b1e0 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c  s = *(struct sql
2b1f0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
2b200 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
2b210 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
2b220 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2b230 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 6d   = mExtra;.    m
2b240 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20 20  xTerm = -1;.    
2b250 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c  assert( pNew->nL
2b260 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e  Slot>=nConstrain
2b270 74 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t );.    for(i=0
2b280 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
2b290 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65   i++) pNew->aLTe
2b2a0 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 70  rm[i] = 0;.    p
2b2b0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  New->u.vtab.omit
2b2c0 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66 6f  Mask = 0;.    fo
2b2d0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
2b2e0 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
2b2f0 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ons++){.      if
2b300 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67  ( (iTerm = pUsag
2b310 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d  e[i].argvIndex -
2b320 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20   1)>=0 ){.      
2b330 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e    j = pIdxCons->
2b340 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
2b350 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d       if( iTerm>=
2b360 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20  nConstraint.    
2b370 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20       || j<0.    
2b380 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e       || j>=pWC->
2b390 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 7c  nTerm.         |
2b3a0 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  | pNew->aLTerm[i
2b3b0 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20  Term]!=0.       
2b3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2b3d0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2b3e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2b3f0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2b400 65 2c 20 22 25 73 2e 78 42 65 73 74 49 6e 64 65  e, "%s.xBestInde
2b410 78 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22  x() malfunction"
2b420 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
2b430 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77            goto w
2b440 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f  hereLoopAddVtab_
2b450 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  exit;.        }.
2b460 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2b470 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72  ( iTerm==nConstr
2b480 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20  aint-1 );.      
2b490 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30    testcase( j==0
2b4a0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
2b4b0 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54  case( j==pWC->nT
2b4c0 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  erm-1 );.       
2b4d0 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
2b4e0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  [j];.        pNe
2b4f0 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65  w->prereq |= pTe
2b500 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
2b510 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b520 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53   iTerm<pNew->nLS
2b530 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  lot );.        p
2b540 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72  New->aLTerm[iTer
2b550 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  m] = pTerm;.    
2b560 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78      if( iTerm>mx
2b570 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20  Term ) mxTerm = 
2b580 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 74  iTerm;.        t
2b590 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
2b5a0 31 35 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  15 );.        te
2b5b0 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31  stcase( iTerm==1
2b5c0 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  6 );.        if(
2b5d0 20 69 54 65 72 6d 3c 31 36 20 26 26 20 70 55 73   iTerm<16 && pUs
2b5e0 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e  age[i].omit ) pN
2b5f0 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d  ew->u.vtab.omitM
2b600 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b  ask |= 1<<iTerm;
2b610 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
2b620 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2b630 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20   WO_IN)!=0 ){.  
2b640 20 20 20 20 20 20 20 20 69 66 28 20 70 55 73 61          if( pUsa
2b650 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b  ge[i].omit==0 ){
2b660 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2b670 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
2b680 6f 20 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73  o use an IN cons
2b690 74 72 61 69 6e 74 20 69 66 20 74 68 65 20 76 69  traint if the vi
2b6a0 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20  rtual table.    
2b6b0 20 20 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20          ** says 
2b6c0 74 68 61 74 20 74 68 65 20 65 71 75 69 76 61 6c  that the equival
2b6d0 65 6e 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e  ent EQ constrain
2b6e0 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65  t cannot be safe
2b6f0 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20  ly omitted..    
2b700 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65          ** If we
2b710 20 64 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75   do attempt to u
2b720 73 65 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72  se such a constr
2b730 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20  aint, some rows 
2b740 6d 69 67 68 74 20 62 65 0a 20 20 20 20 20 20 20  might be.       
2b750 20 20 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64       ** repeated
2b760 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20   in the output. 
2b770 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  */.            b
2b780 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2b790 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  }.          /* A
2b7a0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
2b7b0 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  hat is constrain
2b7c0 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75  ed by an IN clau
2b7d0 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20  se may not.     
2b7e0 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20       ** consume 
2b7f0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2b800 75 73 65 20 62 65 63 61 75 73 65 20 28 31 29 20  use because (1) 
2b810 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20  the order of IN 
2b820 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20 20 20  terms.          
2b830 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ** is not necess
2b840 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f  arily related to
2b850 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75   the order of ou
2b860 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20  tput terms and. 
2b870 20 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20           ** (2) 
2b880 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73  Multiple outputs
2b890 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49   from a single I
2b8a0 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74  N value will not
2b8b0 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20 20   merge.         
2b8c0 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a   ** together.  *
2b8d0 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  /.          pIdx
2b8e0 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
2b8f0 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  sumed = 0;.     
2b900 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2b910 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 43   }.    if( i>=nC
2b920 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20  onstraint ){.   
2b930 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
2b940 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20 20  = mxTerm+1;.    
2b950 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
2b960 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c  nLTerm<=pNew->nL
2b970 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e  Slot );.      pN
2b980 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75  ew->u.vtab.idxNu
2b990 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  m = pIdxInfo->id
2b9a0 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77  xNum;.      pNew
2b9b0 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
2b9c0 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  e = pIdxInfo->ne
2b9d0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a  edToFreeIdxStr;.
2b9e0 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
2b9f0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2ba00 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
2ba10 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
2ba20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  = pIdxInfo->idxS
2ba30 74 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  tr;.      pNew->
2ba40 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64  u.vtab.isOrdered
2ba50 20 3d 20 28 69 38 29 28 70 49 64 78 49 6e 66 6f   = (i8)(pIdxInfo
2ba60 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
2ba70 64 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  d ?.            
2ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba90 20 20 20 20 20 20 20 20 20 20 70 49 64 78 49 6e            pIdxIn
2baa0 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3a 20 30  fo->nOrderBy : 0
2bab0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  );.      pNew->r
2bac0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
2bad0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
2bae0 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d 44  lite3LogEstFromD
2baf0 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e  ouble(pIdxInfo->
2bb00 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
2bb10 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
2bb20 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
2bb30 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d  (pIdxInfo->estim
2bb40 61 74 65 64 52 6f 77 73 29 3b 0a 20 20 20 20 20  atedRows);.     
2bb50 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
2bb60 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
2bb70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
2bb80 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
2bb90 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
2bba0 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
2bbb0 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
2bbc0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
2bbd0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
2bbe0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
2bbf0 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c 6f 6f  .  }  ..whereLoo
2bc00 70 41 64 64 56 74 61 62 5f 65 78 69 74 3a 0a 20  pAddVtab_exit:. 
2bc10 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
2bc20 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
2bc30 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
2bc40 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  IdxInfo->idxStr)
2bc50 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2bc60 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  e(db, pIdxInfo);
2bc70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2bc80 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2bc90 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2bca0 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  LE */../*.** Add
2bcb0 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69   WhereLoop entri
2bcc0 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20  es to handle OR 
2bcd0 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f 72  terms.  This wor
2bce0 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a  ks for either.**
2bcf0 20 62 74 72 65 65 73 20 6f 72 20 76 69 72 74 75   btrees or virtu
2bd00 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  al tables..*/.st
2bd10 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
2bd20 6f 70 41 64 64 4f 72 28 57 68 65 72 65 4c 6f 6f  opAddOr(WhereLoo
2bd30 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
2bd40 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d 45 78 74  er, Bitmask mExt
2bd50 72 61 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  ra){.  WhereInfo
2bd60 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
2bd70 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57  der->pWInfo;.  W
2bd80 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
2bd90 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
2bda0 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ew;.  WhereTerm 
2bdb0 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b  *pTerm, *pWCEnd;
2bdc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2bdd0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75  TE_OK;.  int iCu
2bde0 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  r;.  WhereClause
2bdf0 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72 65   tempWC;.  Where
2be00 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75 62  LoopBuilder sSub
2be10 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f 72  Build;.  WhereOr
2be20 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72 3b 0a  Set sSum, sCur;.
2be30 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2be40 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
2be50 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
2be60 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28 20 70 57  r->pWC;.  if( pW
2be70 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2be80 20 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c   & WHERE_AND_ONL
2be90 59 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  Y ) return SQLIT
2bea0 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e 64 20 3d  E_OK;.  pWCEnd =
2beb0 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e   pWC->a + pWC->n
2bec0 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70  Term;.  pNew = p
2bed0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
2bee0 20 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c 20 30   memset(&sSum, 0
2bef0 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b  , sizeof(sSum));
2bf00 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  .  pItem = pWInf
2bf10 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b  o->pTabList->a +
2bf20 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69   pNew->iTab;.  i
2bf30 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  Cur = pItem->iCu
2bf40 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65  rsor;..  for(pTe
2bf50 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
2bf60 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53  <pWCEnd && rc==S
2bf70 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b  QLITE_OK; pTerm+
2bf80 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65  +){.    if( (pTe
2bf90 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
2bfa0 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26  WO_OR)!=0.     &
2bfb0 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  & (pTerm->u.pOrI
2bfc0 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26  nfo->indexable &
2bfd0 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29   pNew->maskSelf)
2bfe0 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
2bff0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20    WhereClause * 
2c000 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70  const pOrWC = &p
2c010 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
2c020 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65  >wc;.      Where
2c030 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72  Term * const pOr
2c040 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e  WCEnd = &pOrWC->
2c050 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b  a[pOrWC->nTerm];
2c060 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
2c070 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20   *pOrTerm;.     
2c080 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20   int once = 1;. 
2c090 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20       int i, j;. 
2c0a0 20 20 20 0a 20 20 20 20 20 20 73 53 75 62 42 75     .      sSubBu
2c0b0 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b  ild = *pBuilder;
2c0c0 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
2c0d0 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
2c0e0 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
2c0f0 4f 72 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a  OrSet = &sCur;..
2c100 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72        for(pOrTer
2c110 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54  m=pOrWC->a; pOrT
2c120 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f  erm<pOrWCEnd; pO
2c130 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
2c140 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
2c150 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
2c160 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ND)!=0 ){.      
2c170 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57      sSubBuild.pW
2c180 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e  C = &pOrTerm->u.
2c190 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  pAndInfo->wc;.  
2c1a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2c1b0 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
2c1c0 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20  sor==iCur ){.   
2c1d0 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57         tempWC.pW
2c1e0 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
2c1f0 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  fo;.          te
2c200 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57  mpWC.pOuter = pW
2c210 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  C;.          tem
2c220 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  pWC.op = TK_AND;
2c230 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
2c240 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  C.nTerm = 1;.   
2c250 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20         tempWC.a 
2c260 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20  = pOrTerm;.     
2c270 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
2c280 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20  WC = &tempWC;.  
2c290 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c2a0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2c2b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c2c0 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23     sCur.n = 0;.#
2c2d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c2e0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2c2f0 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69          if( IsVi
2c300 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
2c310 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
2c320 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2c330 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42 75  dVirtual(&sSubBu
2c340 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  ild, mExtra);.  
2c350 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
2c360 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
2c370 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
2c380 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73  eLoopAddBtree(&s
2c390 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61  SubBuild, mExtra
2c3a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2c3b0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
2c3c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43  =SQLITE_OK || sC
2c3d0 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ur.n==0 );.     
2c3e0 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30     if( sCur.n==0
2c3f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53   ){.          sS
2c400 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  um.n = 0;.      
2c410 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2c420 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63     }else if( onc
2c430 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  e ){.          w
2c440 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d  hereOrMove(&sSum
2c450 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20  , &sCur);.      
2c460 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20      once = 0;.  
2c470 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c480 20 20 20 20 20 20 20 57 68 65 72 65 4f 72 53 65         WhereOrSe
2c490 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20 20  t sPrev;.       
2c4a0 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26     whereOrMove(&
2c4b0 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20  sPrev, &sSum);. 
2c4c0 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20           sSum.n 
2c4d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
2c4e0 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e  or(i=0; i<sPrev.
2c4f0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
2c500 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2c510 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  sCur.n; j++){.  
2c520 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
2c530 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c  eOrInsert(&sSum,
2c540 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72   sPrev.a[i].prer
2c550 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70  eq | sCur.a[j].p
2c560 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20  rereq,.         
2c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c580 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74     sqlite3LogEst
2c590 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72  Add(sPrev.a[i].r
2c5a0 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72  Run, sCur.a[j].r
2c5b0 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Run),.          
2c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5d0 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
2c5e0 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f  dd(sPrev.a[i].nO
2c5f0 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f  ut, sCur.a[j].nO
2c600 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ut));.          
2c610 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2c620 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c630 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  }.      pNew->nL
2c640 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
2c650 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  pNew->aLTerm[0] 
2c660 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
2c670 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
2c680 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20  HERE_MULTI_OR;. 
2c690 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
2c6a0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  p = 0;.      pNe
2c6b0 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
2c6c0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
2c6d0 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f  New->u, 0, sizeo
2c6e0 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20  f(pNew->u));.   
2c6f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
2c700 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73  SQLITE_OK && i<s
2c710 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  Sum.n; i++){.   
2c720 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
2c730 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61  Currently sSum.a
2c740 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74 20  [i].rRun is set 
2c750 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  to the sum of th
2c760 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20 20  e costs.        
2c770 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63  ** of all sub-sc
2c780 61 6e 73 20 72 65 71 75 69 72 65 64 20 62 79 20  ans required by 
2c790 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77  the OR-scan. How
2c7a0 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f 75  ever, due to rou
2c7b0 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  nding.        **
2c7c0 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79 20   errors, it may 
2c7d0 62 65 20 74 68 61 74 20 74 68 65 20 63 6f 73 74  be that the cost
2c7e0 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e 20   of the OR-scan 
2c7f0 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73 0a  is equal to its.
2c800 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20          ** most 
2c810 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73 63  expensive sub-sc
2c820 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61 6c  an. Add the smal
2c830 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 65  lest possible pe
2c840 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20 2a  nalty .        *
2c850 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  * (equivalent to
2c860 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68 65   multiplying the
2c870 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20 74   cost by 1.07) t
2c880 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a 20  o ensure that . 
2c890 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 64         ** this d
2c8a0 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20  oes not happen. 
2c8b0 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 57  Otherwise, for W
2c8c0 48 45 52 45 20 63 6c 61 75 73 65 73 20 73 75 63  HERE clauses suc
2c8d0 68 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20  h as the.       
2c8e0 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68   ** following wh
2c8f0 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20  ere there is an 
2c900 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20  index on "y":.  
2c910 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2c920 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c 69   **     WHERE li
2c930 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e  kelihood(x=?, 0.
2c940 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20  99) OR y=?.     
2c950 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2c960 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79   the planner may
2c970 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20 74   elect to "OR" t
2c980 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d 74  ogether a full-t
2c990 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61 6e  able scan and an
2c9a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
2c9b0 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74  x lookup. And ot
2c9c0 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64  her similarly od
2c9d0 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20  d results.  */. 
2c9e0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
2c9f0 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52  n = sSum.a[i].rR
2ca00 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  un + 1;.        
2ca10 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75  pNew->nOut = sSu
2ca20 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20  m.a[i].nOut;.   
2ca30 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
2ca40 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72  q = sSum.a[i].pr
2ca50 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63  ereq;.        rc
2ca60 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
2ca70 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
2ca80 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
2ca90 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
2caa0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
2cab0 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
2cac0 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61  jects for all ta
2cad0 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20  bles .*/.static 
2cae0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
2caf0 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  All(WhereLoopBui
2cb00 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b  lder *pBuilder){
2cb10 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
2cb20 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
2cb30 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61  >pWInfo;.  Bitma
2cb40 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20  sk mExtra = 0;. 
2cb50 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20   Bitmask mPrior 
2cb60 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
2cb70 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
2cb80 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
2cb90 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  TabList;.  struc
2cba0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2cbb0 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
2cbc0 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   *db = pWInfo->p
2cbd0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
2cbe0 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e   nTabList = pWIn
2cbf0 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e  fo->nLevel;.  in
2cc00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2cc10 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e  ;.  u8 priorJoin
2cc20 54 79 70 65 20 3d 20 30 3b 0a 20 20 57 68 65 72  Type = 0;.  Wher
2cc30 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20  eLoop *pNew;..  
2cc40 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65  /* Loop over the
2cc50 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
2cc60 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  oin, from left t
2cc70 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65  o right */.  pNe
2cc80 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
2cc90 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49  ew;.  whereLoopI
2cca0 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72  nit(pNew);.  for
2ccb0 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70  (iTab=0, pItem=p
2ccc0 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62  TabList->a; iTab
2ccd0 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54 61 62 2b  <nTabList; iTab+
2cce0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2ccf0 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54   pNew->iTab = iT
2cd00 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61  ab;.    pNew->ma
2cd10 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b  skSelf = getMask
2cd20 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
2cd30 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  et, pItem->iCurs
2cd40 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  or);.    if( ((p
2cd50 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70  Item->jointype|p
2cd60 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26 20  riorJoinType) & 
2cd70 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
2cd80 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  S))!=0 ){.      
2cd90 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b  mExtra = mPrior;
2cda0 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72  .    }.    prior
2cdb0 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49 74 65 6d  JoinType = pItem
2cdc0 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ->jointype;.    
2cdd0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49  if( IsVirtual(pI
2cde0 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
2cdf0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2ce00 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70 42 75  opAddVirtual(pBu
2ce10 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
2ce20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ce30 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2ce40 64 64 42 74 72 65 65 28 70 42 75 69 6c 64 65 72  ddBtree(pBuilder
2ce50 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  , mExtra);.    }
2ce60 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2ce70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ce80 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2ce90 64 4f 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 45  dOr(pBuilder, mE
2cea0 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xtra);.    }.   
2ceb0 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d   mPrior |= pNew-
2cec0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
2ced0 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c  f( rc || db->mal
2cee0 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
2cef0 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f  k;.  }.  whereLo
2cf00 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65 77  opClear(db, pNew
2cf10 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2cf20 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65  }../*.** Examine
2cf30 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77 69   a WherePath (wi
2cf40 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20  th the addition 
2cf50 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68 65  of the extra Whe
2cf60 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35 74  reLoop of the 5t
2cf70 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29  h.** parameters)
2cf80 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75   to see if it ou
2cf90 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68  tputs rows in th
2cfa0 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44 45  e requested ORDE
2cfb0 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55  R BY.** (or GROU
2cfc0 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72 65  P BY) without re
2cfd0 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72 61  quiring a separa
2cfe0 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f  te sort operatio
2cff0 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a 2a  n.  Return N:.**
2d000 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e 20   .**   N>0:   N 
2d010 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
2d020 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
2d030 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20   satisfied.**   
2d040 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73 20  N==0:  No terms 
2d050 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
2d060 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73  clause are satis
2d070 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20 20  fied.**   N<0:  
2d080 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f 77   Unknown yet how
2d090 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20 4f   many terms of O
2d0a0 52 44 45 52 20 42 59 20 6d 69 67 68 74 20 62 65  RDER BY might be
2d0b0 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a 2a   satisfied.   .*
2d0c0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
2d0d0 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 48  rocessing for WH
2d0e0 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64 20  ERE_GROUPBY and 
2d0f0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
2d100 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74   is not as.** st
2d110 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f 55  rict.  With GROU
2d120 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  P BY and DISTINC
2d130 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75 69  T the only requi
2d140 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 2a  rement is that.*
2d150 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77  * equivalent row
2d160 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61  s appear immedia
2d170 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74 6f  tely adjacent to
2d180 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20 47   one another.  G
2d190 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44  ROUP BY.** and D
2d1a0 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20 72  ISTINCT do not r
2d1b0 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61  equire rows to a
2d1c0 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72  ppear in any par
2d1d0 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73  ticular order as
2d1e0 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69   long.** as equi
2d1f0 76 65 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20  velent rows are 
2d200 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72  grouped together
2d210 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55  .  Thus for GROU
2d220 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  P BY and DISTINC
2d230 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42  T.** the pOrderB
2d240 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d  y terms can be m
2d250 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72  atched in any or
2d260 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52  der.  With ORDER
2d270 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72   BY, the .** pOr
2d280 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74  derBy terms must
2d290 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73   be matched in s
2d2a0 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69  trict left-to-ri
2d2b0 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ght order..*/.st
2d2c0 61 74 69 63 20 69 38 20 77 68 65 72 65 50 61 74  atic i8 wherePat
2d2d0 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
2d2e0 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  y(.  WhereInfo *
2d2f0 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68  pWInfo,    /* Th
2d300 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
2d310 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
2d320 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44  rderBy,   /* ORD
2d330 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
2d340 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c  Y or DISTINCT cl
2d350 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  ause to check */
2d360 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 50  .  WherePath *pP
2d370 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ath,     /* The 
2d380 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68 65  WherePath to che
2d390 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ck */.  u16 wctr
2d3a0 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a  lFlags,       /*
2d3b0 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 57   Might contain W
2d3c0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72 20  HERE_GROUPBY or 
2d3d0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
2d3e0 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c   */.  u16 nLoop,
2d3f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2d400 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
2d410 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   in pPath->aLoop
2d420 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  [] */.  WhereLoo
2d430 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a  p *pLast,     /*
2d440 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65 4c   Add this WhereL
2d450 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  oop to the end o
2d460 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d  f pPath->aLoop[]
2d470 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70   */.  Bitmask *p
2d480 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f  RevMask     /* O
2d490 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72  UT: Mask of Wher
2d4a0 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e  eLoops to run in
2d4b0 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
2d4c0 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74  /.){.  u8 revSet
2d4d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2d4e0 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20 6b  True if rev is k
2d4f0 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76  nown */.  u8 rev
2d500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d510 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72  /* Composite sor
2d520 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
2d530 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20 20  revIdx;         
2d540 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74     /* Index sort
2d550 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69   order */.  u8 i
2d560 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20  sOrderDistinct; 
2d570 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57    /* All prior W
2d580 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72  hereLoops are or
2d590 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a  der-distinct */.
2d5a0 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c    u8 distinctCol
2d5b0 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20  umns;   /* True 
2d5c0 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20  if the loop has 
2d5d0 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20  UNIQUE NOT NULL 
2d5e0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20  columns */.  u8 
2d5f0 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20  isMatch;        
2d600 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61     /* iColumn ma
2d610 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20  tches a term of 
2d620 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2d630 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65  use */.  u16 nKe
2d640 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 2f  yCol;          /
2d650 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  * Number of key 
2d660 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65  columns in pInde
2d670 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75  x */.  u16 nColu
2d680 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
2d690 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2d6a0 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20  ordered columns 
2d6b0 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  in the index */.
2d6c0 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20    u16 nOrderBy; 
2d6d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2d6e0 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  r terms in the O
2d6f0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
2d700 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
2d710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2d720 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  ex of WhereLoop 
2d730 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20 70  in pPath being p
2d740 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e  rocessed */.  in
2d750 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2d760 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2d770 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ters */.  int iC
2d780 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ur;             
2d790 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
2d7a0 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65   for current Whe
2d7b0 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  reLoop */.  int 
2d7c0 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
2d7d0 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75    /* A column nu
2d7e0 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c  mber within tabl
2d7f0 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72  e iCur */.  Wher
2d800 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30  eLoop *pLoop = 0
2d810 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65  ; /* Current Whe
2d820 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f  reLoop being pro
2d830 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65  cessed. */.  Whe
2d840 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
2d850 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
2d860 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
2d870 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
2d880 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20  r *pOBExpr;     
2d890 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73     /* An express
2d8a0 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44  ion from the ORD
2d8b0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
2d8c0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
2d8d0 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41  ;       /* COLLA
2d8e0 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d  TE function from
2d8f0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
2d900 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e  use term */.  In
2d910 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
2d920 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
2d930 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2d940 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69   pLoop */.  sqli
2d950 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f  te3 *db = pWInfo
2d960 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  ->pParse->db;  /
2d970 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
2d980 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ction */.  Bitma
2d990 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20  sk obSat = 0;   
2d9a0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45   /* Mask of ORDE
2d9b0 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73  R BY terms satis
2d9c0 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  fied so far */. 
2d9d0 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b   Bitmask obDone;
2d9e0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
2d9f0 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74  f all ORDER BY t
2da00 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
2da10 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  k orderDistinctM
2da20 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  ask;  /* Mask of
2da30 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65   all well-ordere
2da40 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74  d loops */.  Bit
2da50 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20  mask ready;     
2da60 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
2da70 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20   of inner loops 
2da80 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65  */..  /*.  ** We
2da90 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
2daa0 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20  op is "one-row" 
2dab0 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73 20  if it generates 
2dac0 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
2dad0 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74  .  ** row of out
2dae0 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f  put.  A WhereLoo
2daf0 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20  p is one-row if 
2db00 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
2db10 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
2db20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64   **  (a) All ind
2db30 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68  ex columns match
2db40 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55   with WHERE_COLU
2db50 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29  MN_EQ..  **  (b)
2db60 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e   The index is un
2db70 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68  ique.  ** Any Wh
2db80 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20  ereLoop with an 
2db90 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
2dba0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
2dbb0 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72  e rowid is one-r
2dbc0 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f  ow..  ** Every o
2dbd0 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70  ne-row WhereLoop
2dbe0 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57   will have the W
2dbf0 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20  HERE_ONEROW bit 
2dc00 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a  set in wsFlags..
2dc10 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79    **.  ** We say
2dc20 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69   the WhereLoop i
2dc30 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  s "order-distinc
2dc40 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f 66  t" if the set of
2dc50 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20   columns from.  
2dc60 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f  ** that WhereLoo
2dc70 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  p that are in th
2dc80 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2dc90 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20  e are different 
2dca0 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72  for every.  ** r
2dcb0 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ow of the WhereL
2dcc0 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d  oop.  Every one-
2dcd0 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  row WhereLoop is
2dce0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20   automatically. 
2dcf0 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   ** order-distin
2dd00 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f  ct.   A WhereLoo
2dd10 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f  p that has no co
2dd20 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44  lumns in the ORD
2dd30 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a  ER BY clause.  *
2dd40 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64  * is not order-d
2dd50 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f  istinct. To be o
2dd60 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73  rder-distinct is
2dd70 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20 73   not quite the s
2dd80 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a  ame as being.  *
2dd90 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61  * UNIQUE since a
2dda0 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f   UNIQUE column o
2ddb0 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65  r index can have
2ddc0 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74   multiple rows t
2ddd0 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55  hat .  ** are NU
2dde0 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75  LL and NULL valu
2ddf0 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e  es are equivalen
2de00 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73  t for the purpos
2de10 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69  e of order-disti
2de20 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20  nct..  ** To be 
2de30 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20  order-distinct, 
2de40 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74  the columns must
2de50 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e   be UNIQUE and N
2de60 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20  OT NULL..  **.  
2de70 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
2de80 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61   a table is alwa
2de90 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f  ys UNIQUE and NO
2dea0 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76  T NULL so whenev
2deb0 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69  er the.  ** rowi
2dec0 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  d appears in the
2ded0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2dee0 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
2def0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ing WhereLoop is
2df00 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
2df10 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  lly order-distin
2df20 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65  ct..  */..  asse
2df30 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
2df40 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26  );.  if( nLoop &
2df50 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  & OptimizationDi
2df60 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
2df70 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e  E_OrderByIdxJoin
2df80 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  ) ) return 0;.. 
2df90 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
2dfa0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74  erBy->nExpr;.  t
2dfb0 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42  estcase( nOrderB
2dfc0 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66  y==BMS-1 );.  if
2dfd0 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31  ( nOrderBy>BMS-1
2dfe0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
2dff0 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65   Cannot optimize
2e000 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52   overly large OR
2e010 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f  DER BYs */.  isO
2e020 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
2e030 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53  ;.  obDone = MAS
2e040 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31  KBIT(nOrderBy)-1
2e050 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63  ;.  orderDistinc
2e060 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61  tMask = 0;.  rea
2e070 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c  dy = 0;.  for(iL
2e080 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69  oop=0; isOrderDi
2e090 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c  stinct && obSat<
2e0a0 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c  obDone && iLoop<
2e0b0 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  =nLoop; iLoop++)
2e0c0 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e  {.    if( iLoop>
2e0d0 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f  0 ) ready |= pLo
2e0e0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
2e0f0 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c    pLoop = iLoop<
2e100 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61  nLoop ? pPath->a
2e110 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c  Loop[iLoop] : pL
2e120 61 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  ast;.    if( pLo
2e130 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2e140 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
2e150 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   ){.      if( pL
2e160 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72  oop->u.vtab.isOr
2e170 64 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d 20  dered ) obSat = 
2e180 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72  obDone;.      br
2e190 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
2e1a0 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Cur = pWInfo->pT
2e1b0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d  abList->a[pLoop-
2e1c0 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a  >iTab].iCursor;.
2e1d0 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66  .    /* Mark off
2e1e0 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74 65   any ORDER BY te
2e1f0 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20 63  rm X that is a c
2e200 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62  olumn in the tab
2e210 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  le of.    ** the
2e220 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f   current loop fo
2e230 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73  r which there is
2e240 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
2e250 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  RE.    ** clause
2e260 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49   of the form X I
2e270 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68  S NULL or X=? th
2e280 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  at reference onl
2e290 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c  y outer.    ** l
2e2a0 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oops..    */.   
2e2b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
2e2c0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
2e2d0 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
2e2e0 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
2e2f0 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45 78  nue;.      pOBEx
2e300 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
2e310 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64  SkipCollate(pOrd
2e320 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2e330 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42  );.      if( pOB
2e340 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
2e350 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UMN ) continue;.
2e360 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
2e370 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20  r->iTable!=iCur 
2e380 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2e390 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
2e3a0 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  rm(&pWInfo->sWC,
2e3b0 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e   iCur, pOBExpr->
2e3c0 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
2e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3e0 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  ~ready, WO_EQ|WO
2e3f0 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20  _ISNULL, 0);.   
2e400 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
2e410 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2e420 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
2e430 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d  perator&WO_EQ)!=
2e440 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43  0 && pOBExpr->iC
2e450 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
2e460 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2e470 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20  z1, *z2;.       
2e480 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2e490 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
2e4a0 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64  fo->pParse, pOrd
2e4b0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2e4c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
2e4d0 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
2e4e0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2e4f0 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c         z1 = pCol
2e500 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l->zName;.      
2e510 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2e520 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
2e530 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65  nfo->pParse, pTe
2e540 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  rm->pExpr);.    
2e550 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
2e560 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
2e570 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
2e580 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  z2 = pColl->zNam
2e590 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
2e5a0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
2e5b0 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69  , z2)!=0 ) conti
2e5c0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
2e5d0 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
2e5e0 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20  BIT(i);.    }.. 
2e5f0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
2e600 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
2e610 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20  NEROW)==0 ){.   
2e620 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
2e630 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  Flags & WHERE_IP
2e640 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  K ){.        pIn
2e650 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dex = 0;.       
2e660 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20   nKeyCol = 0;.  
2e670 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20        nColumn = 
2e680 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
2e690 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f  f( (pIndex = pLo
2e6a0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
2e6b0 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78  ex)==0 || pIndex
2e6c0 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a  ->bUnordered ){.
2e6d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
2e6e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2e6f0 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d         nKeyCol =
2e700 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c   pIndex->nKeyCol
2e710 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d  ;.        nColum
2e720 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  n = pIndex->nCol
2e730 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  umn;.        ass
2e740 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b  ert( nColumn==nK
2e750 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52  eyCol+1 || !HasR
2e760 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61  owid(pIndex->pTa
2e770 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ble) );.        
2e780 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
2e790 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e  aiColumn[nColumn
2e7a0 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21 48 61  -1]==(-1) || !Ha
2e7b0 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70  sRowid(pIndex->p
2e7c0 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20  Table));.       
2e7d0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2e7e0 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72   = pIndex->onErr
2e7f0 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 20  or!=OE_None;.   
2e800 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c     }..      /* L
2e810 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
2e820 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
2e830 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69  ndex and deal wi
2e840 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20  th the ones.    
2e850 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f    ** that are no
2e860 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  t constrained by
2e870 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20   == or IN..     
2e880 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20   */.      rev = 
2e890 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20  revSet = 0;.    
2e8a0 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
2e8b0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  s = 0;.      for
2e8c0 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b  (j=0; j<nColumn;
2e8d0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   j++){.        u
2e8e0 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72  8 bOnce;   /* Tr
2e8f0 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52  ue to run the OR
2e900 44 45 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f  DER BY search lo
2e910 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  op */..        /
2e920 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61  * Skip over == a
2e930 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73  nd IS NULL terms
2e940 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2e950 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  j<pLoop->u.btree
2e960 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
2e970 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2e980 6e 53 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20 20  nSkip==0.       
2e990 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70    && ((i = pLoop
2e9a0 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70  ->aLTerm[j]->eOp
2e9b0 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51  erator) & (WO_EQ
2e9c0 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a  |WO_ISNULL))!=0.
2e9d0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2e9e0 20 20 20 20 20 69 66 28 20 69 20 26 20 57 4f 5f       if( i & WO_
2e9f0 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ISNULL ){.      
2ea00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ea10 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2ea20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2ea30 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
2ea40 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
2ea50 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2ea60 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d 0a  ue;  .        }.
2ea70 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20  .        /* Get 
2ea80 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
2ea90 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28  r in the table (
2eaa0 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72  iColumn) and sor
2eab0 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  t order.        
2eac0 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72 20  ** (revIdx) for 
2ead0 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20  the j-th column 
2eae0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  of the index..  
2eaf0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2eb00 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
2eb10 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
2eb20 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c   = pIndex->aiCol
2eb30 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
2eb40 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65    revIdx = pInde
2eb50 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  x->aSortOrder[j]
2eb60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2eb70 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d  iColumn==pIndex-
2eb80 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29  >pTable->iPKey )
2eb90 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
2eba0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2ebb0 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
2ebc0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
2ebd0 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  revIdx = 0;.    
2ebe0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2ebf0 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e  * An unconstrain
2ec00 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d  ed column that m
2ec10 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61  ight be NULL mea
2ec20 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20 20 20  ns that this.   
2ec30 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f       ** WhereLoo
2ec40 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72  p is not well-or
2ec50 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f  dered.        */
2ec60 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
2ec70 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20  rderDistinct.   
2ec80 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e        && iColumn
2ec90 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  >=0.         && 
2eca0 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  j>=pLoop->u.btre
2ecb0 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26  e.nEq.         &
2ecc0 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  & pIndex->pTable
2ecd0 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e  ->aCol[iColumn].
2ece0 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20  notNull==0.     
2ecf0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2ed00 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2ed10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
2ed20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20          /* Find 
2ed30 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72  the ORDER BY ter
2ed40 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  m that correspon
2ed50 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63  ds to the j-th c
2ed60 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a  olumn.        **
2ed70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
2ed80 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45  d mark that ORDE
2ed90 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20  R BY term off . 
2eda0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2edb0 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20    bOnce = 1;.   
2edc0 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30       isMatch = 0
2edd0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2ede0 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f  0; bOnce && i<nO
2edf0 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
2ee00 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b          if( MASK
2ee10 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
2ee20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2ee30 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73       pOBExpr = s
2ee40 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
2ee50 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e  llate(pOrderBy->
2ee60 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
2ee70 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2ee80 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
2ee90 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20  ERE_GROUPBY );. 
2eea0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2eeb0 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  e( wctrlFlags & 
2eec0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
2eed0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2eee0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
2eef0 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57  (WHERE_GROUPBY|W
2ef00 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29  HERE_DISTINCTBY)
2ef10 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30  )==0 ) bOnce = 0
2ef20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ef30 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  pOBExpr->op!=TK_
2ef40 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75  COLUMN ) continu
2ef50 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
2ef60 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65   pOBExpr->iTable
2ef70 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  !=iCur ) continu
2ef80 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
2ef90 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
2efa0 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  n!=iColumn ) con
2efb0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2efc0 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20   if( iColumn>=0 
2efd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
2efe0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2eff0 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
2f000 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
2f010 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
2f020 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2f030 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
2f040 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
2f050 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2f060 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2f070 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
2f080 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29  ndex->azColl[j])
2f090 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
2f0a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f0b0 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
2f0c0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
2f0d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2f0e0 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63        if( isMatc
2f0f0 68 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63  h && (pWInfo->wc
2f100 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2f110 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a  _GROUPBY)==0 ){.
2f120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
2f130 65 20 73 75 72 65 20 74 68 65 20 73 6f 72 74 20  e sure the sort 
2f140 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69  order is compati
2f150 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20  ble in an ORDER 
2f160 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20  BY clause..     
2f170 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64       ** Sort ord
2f180 65 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74  er is irrelevant
2f190 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20   for a GROUP BY 
2f1a0 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20  clause. */.     
2f1b0 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74 20       if( revSet 
2f1c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2f1d0 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78  f( (rev ^ revIdx
2f1e0 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  )!=pOrderBy->a[i
2f1f0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69 73  ].sortOrder ) is
2f200 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  Match = 0;.     
2f210 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f220 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65          rev = re
2f230 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d  vIdx ^ pOrderBy-
2f240 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
2f250 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2f260 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b   rev ) *pRevMask
2f270 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f   |= MASKBIT(iLoo
2f280 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
2f290 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20  revSet = 1;.    
2f2a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f2b0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
2f2c0 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Match ){.       
2f2d0 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30     if( iColumn<0
2f2e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f2f0 74 65 73 74 63 61 73 65 28 20 64 69 73 74 69 6e  testcase( distin
2f300 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a  ctColumns==0 );.
2f310 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
2f320 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b  inctColumns = 1;
2f330 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f340 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20         obSat |= 
2f350 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
2f360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f370 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68       /* No match
2f380 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
2f390 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20      if( j==0 || 
2f3a0 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  j<nKeyCol ){.   
2f3b0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2f3c0 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
2f3d0 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct!=0 );.       
2f3e0 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
2f3f0 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
2f400 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2f410 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
2f420 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20  .      } /* end 
2f430 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
2f440 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  dex columns */. 
2f450 20 20 20 20 20 69 66 28 20 64 69 73 74 69 6e 63       if( distinc
2f460 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20  tColumns ){.    
2f470 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
2f480 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30  OrderDistinct==0
2f490 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72   );.        isOr
2f4a0 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b  derDistinct = 1;
2f4b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f  .      }.    } /
2f4c0 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65  * end-if not one
2f4d0 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  -row */..    /* 
2f4e0 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68  Mark off any oth
2f4f0 65 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  er ORDER BY term
2f500 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  s that reference
2f510 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66   pLoop */.    if
2f520 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
2f530 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72  t ){.      order
2f540 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20  DistinctMask |= 
2f550 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  pLoop->maskSelf;
2f560 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2f570 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
2f580 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
2f590 70 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  p;.        Bitma
2f5a0 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20  sk mTerm;.      
2f5b0 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
2f5c0 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
2f5d0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d  nue;.        p =
2f5e0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
2f5f0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6d  pExpr;.        m
2f600 54 65 72 6d 20 3d 20 65 78 70 72 54 61 62 6c 65  Term = exprTable
2f610 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73  Usage(&pWInfo->s
2f620 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20  MaskSet,p);.    
2f630 20 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30      if( mTerm==0
2f640 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
2f650 49 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29 20  IsConstant(p) ) 
2f660 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2f670 20 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72    if( (mTerm&~or
2f680 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29  derDistinctMask)
2f690 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2f6a0 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49   obSat |= MASKBI
2f6b0 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  T(i);.        }.
2f6c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2f6d0 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f  } /* End the loo
2f6e0 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65  p over all Where
2f6f0 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72  Loops from outer
2f700 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e  -most down to in
2f710 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66  ner-most */.  if
2f720 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20  ( obSat==obDone 
2f730 29 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f 72  ) return (i8)nOr
2f740 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69 73  derBy;.  if( !is
2f750 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b  OrderDistinct ){
2f760 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65  .    for(i=nOrde
2f770 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  rBy-1; i>0; i--)
2f780 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
2f790 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20 2d  m = MASKBIT(i) -
2f7a0 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f   1;.      if( (o
2f7b0 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74  bSat&m)==m ) ret
2f7c0 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  urn i;.    }.   
2f7d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2f7e0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a   return -1;.}...
2f7f0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45  /*.** If the WHE
2f800 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20  RE_GROUPBY flag 
2f810 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d 61  is set in the ma
2f820 73 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  sk passed to sql
2f830 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2f840 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72  ,.** the planner
2f850 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
2f860 65 20 73 70 65 63 69 66 69 65 64 20 70 4f 72 64  e specified pOrd
2f870 65 72 42 79 20 6c 69 73 74 20 69 73 20 61 63 74  erBy list is act
2f880 75 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a  ually a GROUP.**
2f890 20 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e 64   BY clause - and
2f8a0 20 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74 68   so any order th
2f8b0 61 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20 61  at groups rows a
2f8c0 73 20 72 65 71 75 69 72 65 64 20 73 61 74 69 73  s required satis
2f8d0 66 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71 75  fies the.** requ
2f8e0 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  est..**.** Norma
2f8f0 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61 73  lly, in this cas
2f900 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
2f910 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61 6c  ible for the cal
2f920 6c 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ler to determine
2f930 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e  .** whether or n
2f940 6f 74 20 74 68 65 20 72 6f 77 73 20 61 72 65 20  ot the rows are 
2f950 72 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c  really being del
2f960 69 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65 64  ivered in sorted
2f970 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75   order, or.** ju
2f980 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  st in some other
2f990 20 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f 76   order that prov
2f9a0 69 64 65 73 20 74 68 65 20 72 65 71 75 69 72 65  ides the require
2f9b0 64 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65  d grouping. Howe
2f9c0 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57  ver,.** if the W
2f9d0 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
2f9e0 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70 61   flag is also pa
2f9f0 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
2fa00 68 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68 65  hereBegin(), the
2fa10 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  n.** this functi
2fa20 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
2fa30 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   on the returned
2fa40 20 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63   WhereInfo objec
2fa50 74 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a  t. It returns.**
2fa60 20 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77   true if the row
2fa70 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65  s really will be
2fa80 20 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20 73   sorted in the s
2fa90 70 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c 20  pecified order, 
2faa0 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65  or false.** othe
2fab0 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rwise..**.** For
2fac0 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
2fad0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  ng:.**.**   CREA
2fae0 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
2faf0 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74  1(x, Y);.**.** t
2fb00 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  hen.**.**   SELE
2fb10 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f  CT * FROM t1 GRO
2fb20 55 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52 20  UP BY x,y ORDER 
2fb30 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53  BY x,y;   -- IsS
2fb40 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20  orted()==1.**   
2fb50 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2fb60 20 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f 52   GROUP BY y,x OR
2fb70 44 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d  DER BY y,x;   --
2fb80 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a   IsSorted()==0.*
2fb90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
2fba0 72 65 49 73 53 6f 72 74 65 64 28 57 68 65 72 65  reIsSorted(Where
2fbb0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
2fbc0 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
2fbd0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2fbe0 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20  ERE_GROUPBY );. 
2fbf0 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
2fc00 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2fc10 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
2fc20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
2fc30 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23  fo->sorted;.}..#
2fc40 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
2fc50 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20  _ENABLED./* For 
2fc60 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e  debugging use on
2fc70 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ly: */.static co
2fc80 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72 65 50  nst char *whereP
2fc90 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74  athName(WherePat
2fca0 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c  h *pPath, int nL
2fcb0 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  oop, WhereLoop *
2fcc0 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63  pLast){.  static
2fcd0 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b   char zName[65];
2fce0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
2fcf0 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b  i=0; i<nLoop; i+
2fd00 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70  +){ zName[i] = p
2fd10 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e  Path->aLoop[i]->
2fd20 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61  cId; }.  if( pLa
2fd30 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20  st ) zName[i++] 
2fd40 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20  = pLast->cId;.  
2fd50 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  zName[i] = 0;.  
2fd60 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
2fd70 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
2fd80 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ven the list of 
2fd90 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2fda0 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  s at pWInfo->pLo
2fdb0 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ops, this routin
2fdc0 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  e.** attempts to
2fdd0 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74   find the lowest
2fde0 20 63 6f 73 74 20 70 61 74 68 20 74 68 61 74 20   cost path that 
2fdf0 76 69 73 69 74 73 20 65 61 63 68 20 57 68 65 72  visits each Wher
2fe00 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20  eLoop.** once.  
2fe10 54 68 69 73 20 70 61 74 68 20 69 73 20 74 68 65  This path is the
2fe20 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68  n loaded into th
2fe30 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57  e pWInfo->a[].pW
2fe40 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a  Loop fields..**.
2fe50 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74  ** Assume that t
2fe60 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
2fe70 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74  of output rows t
2fe80 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  hat will need to
2fe90 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69   be sorted.** wi
2fea0 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69  ll be nRowEst (i
2feb0 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65  n the 10*log2 re
2fec0 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20  presentation).  
2fed0 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69  Or, ignore sorti
2fee0 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e  ng.** costs if n
2fef0 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  RowEst==0..**.**
2ff00 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2ff10 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
2ff20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20  SQLITE_NOMEM of 
2ff30 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
2ff40 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  ion.** error occ
2ff50 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
2ff60 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76  nt wherePathSolv
2ff70 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  er(WhereInfo *pW
2ff80 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f  Info, LogEst nRo
2ff90 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43  wEst){.  int mxC
2ffa0 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20  hoice;          
2ffb0 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
2ffc0 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e  mber of simultan
2ffd0 65 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b  eous paths track
2ffe0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  ed */.  int nLoo
2fff0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
30000 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
30010 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  erms in the join
30020 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
30030 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
30040 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
30050 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
30060 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
30070 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
30080 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
30090 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20    int iLoop;    
300a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
300b0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72  oop counter over
300c0 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
300d0 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  e join */.  int 
300e0 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20  ii, jj;         
300f0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
30100 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
30110 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mxI = 0;        
30120 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
30130 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20  f next entry to 
30140 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74  replace */.  int
30150 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
30160 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
30170 20 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61   of ORDER BY cla
30180 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c  use terms */.  L
30190 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20 20  ogEst rCost;    
301a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
301b0 20 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a 20 20   of a path */.  
301c0 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20  LogEst nOut;    
301d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
301e0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73 20 2a  ber of outputs *
301f0 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73  /.  LogEst mxCos
30200 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
30210 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66   Maximum cost of
30220 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73 20   a set of paths 
30230 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 4f 75  */.  LogEst mxOu
30240 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
30250 2a 20 4d 61 78 69 6d 75 6d 20 6e 4f 75 74 20 76  * Maximum nOut v
30260 61 6c 75 65 20 6f 6e 20 74 68 65 20 73 65 74 20  alue on the set 
30270 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 6e  of paths */.  in
30280 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20  t nTo, nFrom;   
30290 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
302a0 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69  r of valid entri
302b0 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20  es in aTo[] and 
302c0 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65  aFrom[] */.  Whe
302d0 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20  rePath *aFrom;  
302e0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46         /* All nF
302f0 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68 65  rom paths at the
30300 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20   previous level 
30310 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
30320 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  aTo;           /
30330 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70  * The nTo best p
30340 61 74 68 73 20 61 74 20 74 68 65 20 63 75 72 72  aths at the curr
30350 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ent level */.  W
30360 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b  herePath *pFrom;
30370 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
30380 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b  lement of aFrom[
30390 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f  ] that we are wo
303a0 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68  rking on */.  Wh
303b0 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20  erePath *pTo;   
303c0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c          /* An el
303d0 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74  ement of aTo[] t
303e0 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69  hat we are worki
303f0 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ng on */.  Where
30400 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20  Loop *pWLoop;   
30410 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
30420 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
30430 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c  ects */.  WhereL
30440 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20  oop **pX;       
30450 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64      /* Used to d
30460 69 76 79 20 75 70 20 74 68 65 20 70 53 70 61 63  ivy up the pSpac
30470 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 63 68  e memory */.  ch
30480 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20  ar *pSpace;     
30490 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
304a0 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64  rary memory used
304b0 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
304c0 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
304d0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
304e0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
304f0 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49  b;.  nLoop = pWI
30500 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f  nfo->nLevel;.  /
30510 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69  * TUNING: For si
30520 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e  mple queries, on
30530 6c 79 20 74 68 65 20 62 65 73 74 20 70 61 74 68  ly the best path
30540 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a   is tracked..  *
30550 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e  * For 2-way join
30560 73 2c 20 74 68 65 20 35 20 62 65 73 74 20 70 61  s, the 5 best pa
30570 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64  ths are followed
30580 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73  ..  ** For joins
30590 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61   of 3 or more ta
305a0 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20  bles, track the 
305b0 31 30 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f  10 best paths */
305c0 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e  .  mxChoice = (n
305d0 4c 6f 6f 70 3d 3d 31 29 20 3f 20 31 20 3a 20 28  Loop==1) ? 1 : (
305e0 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31  nLoop==2 ? 5 : 1
305f0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c  0);.  assert( nL
30600 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61  oop<=pWInfo->pTa
30610 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
30620 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30   WHERETRACE(0x00
30630 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20  2, ("---- begin 
30640 73 6f 6c 76 65 72 5c 6e 22 29 29 3b 0a 0a 20 20  solver\n"));..  
30650 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
30660 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65  initialize space
30670 20 66 6f 72 20 61 54 6f 20 61 6e 64 20 61 46 72   for aTo and aFr
30680 6f 6d 20 2a 2f 0a 20 20 69 69 20 3d 20 28 73 69  om */.  ii = (si
30690 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b  zeof(WherePath)+
306a0 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
306b0 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69  *)*nLoop)*mxChoi
306c0 63 65 2a 32 3b 0a 20 20 70 53 70 61 63 65 20 3d  ce*2;.  pSpace =
306d0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
306e0 52 61 77 28 64 62 2c 20 69 69 29 3b 0a 20 20 69  Raw(db, ii);.  i
306f0 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72  f( pSpace==0 ) r
30700 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
30710 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68 65  EM;.  aTo = (Whe
30720 72 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b 0a  rePath*)pSpace;.
30730 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78    aFrom = aTo+mx
30740 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74  Choice;.  memset
30750 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f  (aFrom, 0, sizeo
30760 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20  f(aFrom[0]));.  
30770 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a  pX = (WhereLoop*
30780 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63  *)(aFrom+mxChoic
30790 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43  e);.  for(ii=mxC
307a0 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61  hoice*2, pFrom=a
307b0 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20  To; ii>0; ii--, 
307c0 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e  pFrom++, pX += n
307d0 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d  Loop){.    pFrom
307e0 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20  ->aLoop = pX;.  
307f0 7d 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65  }..  /* Seed the
30800 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73   search with a s
30810 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20  ingle WherePath 
30820 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20  containing zero 
30830 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a  WhereLoops..  **
30840 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f  .  ** TUNING: Do
30850 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d   not let the num
30860 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
30870 73 20 67 6f 20 61 62 6f 76 65 20 32 35 2e 20 20  s go above 25.  
30880 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a  If the cost.  **
30890 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e   of computing an
308a0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
308b0 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63   is not paid bac
308c0 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  k within the fir
308d0 73 74 20 32 35 0a 20 20 2a 2a 20 72 6f 77 73 2c  st 25.  ** rows,
308e0 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65   then do not use
308f0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
30900 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d  ndex. */.  aFrom
30910 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70  [0].nRow = MIN(p
30920 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
30930 70 2c 20 34 36 29 3b 20 20 61 73 73 65 72 74 28  p, 46);  assert(
30940 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   46==sqlite3LogE
30950 73 74 28 32 35 29 20 29 3b 0a 20 20 6e 46 72 6f  st(25) );.  nFro
30960 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50 72 65  m = 1;..  /* Pre
30970 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 73 74  compute the cost
30980 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65 20   of sorting the 
30990 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 73 65 74  final result set
309a0 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 0a  , if the caller.
309b0 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 57    ** to sqlite3W
309c0 68 65 72 65 42 65 67 69 6e 28 29 20 77 61 73 20  hereBegin() was 
309d0 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20  concerned about 
309e0 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 69 66 28  sorting */.  if(
309f0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
30a00 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d  y==0 || nRowEst=
30a10 3d 30 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 5b  =0 ){.    aFrom[
30a20 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 30  0].isOrdered = 0
30a30 3b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d  ;.    nOrderBy =
30a40 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
30a50 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65   aFrom[0].isOrde
30a60 72 65 64 20 3d 20 2d 31 3b 0a 20 20 20 20 6e 4f  red = -1;.    nO
30a70 72 64 65 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d  rderBy = pWInfo-
30a80 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
30a90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
30aa0 75 74 65 20 73 75 63 63 65 73 73 69 76 65 6c 79  ute successively
30ab0 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74   longer WherePat
30ac0 68 73 20 75 73 69 6e 67 20 74 68 65 20 70 72 65  hs using the pre
30ad0 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e  vious generation
30ae0 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61  .  ** of WherePa
30af0 74 68 73 20 61 73 20 74 68 65 20 62 61 73 69 73  ths as the basis
30b00 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20   for the next.  
30b10 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
30b20 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20  e mxChoice.  ** 
30b30 62 65 73 74 20 70 61 74 68 73 20 61 74 20 65 61  best paths at ea
30b40 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  ch generation */
30b50 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
30b60 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
30b70 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d  op++){.    nTo =
30b80 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   0;.    for(ii=0
30b90 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69  , pFrom=aFrom; i
30ba0 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70  i<nFrom; ii++, p
30bb0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66  From++){.      f
30bc0 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f  or(pWLoop=pWInfo
30bd0 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70  ->pLoops; pWLoop
30be0 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d  ; pWLoop=pWLoop-
30bf0 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20  >pNextLoop){.   
30c00 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73       Bitmask mas
30c10 6b 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 42 69  kNew;.        Bi
30c20 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
30c30 30 3b 0a 20 20 20 20 20 20 20 20 69 38 20 69 73  0;.        i8 is
30c40 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d  Ordered = pFrom-
30c50 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20  >isOrdered;.    
30c60 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d      if( (pWLoop-
30c70 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d  >prereq & ~pFrom
30c80 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29  ->maskLoop)!=0 )
30c90 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
30ca0 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e     if( (pWLoop->
30cb0 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d  maskSelf & pFrom
30cc0 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29  ->maskLoop)!=0 )
30cd0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
30ce0 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
30cf0 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61  int, pWLoop is a
30d00 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65   candidate to be
30d10 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20   the next loop. 
30d20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70  .        ** Comp
30d30 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a  ute its cost */.
30d40 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20          rCost = 
30d50 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
30d60 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c  (pWLoop->rSetup,
30d70 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70  pWLoop->rRun + p
30d80 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20  From->nRow);.   
30d90 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c       rCost = sql
30da0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 43  ite3LogEstAdd(rC
30db0 6f 73 74 2c 20 70 46 72 6f 6d 2d 3e 72 43 6f 73  ost, pFrom->rCos
30dc0 74 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74  t);.        nOut
30dd0 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b   = pFrom->nRow +
30de0 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20   pWLoop->nOut;. 
30df0 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d         maskNew =
30e00 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
30e10 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   | pWLoop->maskS
30e20 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28  elf;.        if(
30e30 20 69 73 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a   isOrdered<0 ){.
30e40 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
30e50 72 65 64 20 3d 20 77 68 65 72 65 50 61 74 68 53  red = wherePathS
30e60 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
30e70 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20  pWInfo,.        
30e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
30e90 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c  WInfo->pOrderBy,
30ea0 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e   pFrom, pWInfo->
30eb0 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20  wctrlFlags,.    
30ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ed0 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70     iLoop, pWLoop
30ee0 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20  , &revMask);.   
30ef0 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
30f00 65 72 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64  ered>=0 && isOrd
30f10 65 72 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b  ered<nOrderBy ){
30f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
30f30 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65  TUNING: Estimate
30f40 64 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c  d cost of a full
30f50 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20   external sort, 
30f60 77 68 65 72 65 20 4e 20 69 73 20 0a 20 20 20 20  where N is .    
30f70 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e          ** the n
30f80 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f  umber of rows to
30f90 20 73 6f 72 74 20 69 73 3a 0a 20 20 20 20 20 20   sort is:.      
30fa0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
30fb0 20 20 20 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d       **   cost =
30fc0 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28   (3.0 * N * log(
30fd0 4e 29 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  N))..           
30fe0 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20 20   ** .           
30ff0 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 6f   ** Or, if the o
31000 72 64 65 72 2d 62 79 20 63 6c 61 75 73 65 20 68  rder-by clause h
31010 61 73 20 58 20 74 65 72 6d 73 20 62 75 74 20 6f  as X terms but o
31020 6e 6c 79 20 74 68 65 20 6c 61 73 74 20 59 20 0a  nly the last Y .
31030 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
31040 65 72 6d 73 20 61 72 65 20 6f 75 74 20 6f 66 20  erms are out of 
31050 6f 72 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63  order, then bloc
31060 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72  k-sorting will r
31070 65 64 75 63 65 20 74 68 65 20 0a 20 20 20 20 20  educe the .     
31080 20 20 20 20 20 20 20 2a 2a 20 73 6f 72 74 69 6e         ** sortin
31090 67 20 63 6f 73 74 20 74 6f 3a 0a 20 20 20 20 20  g cost to:.     
310a0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
310b0 20 20 20 20 20 20 2a 2a 20 20 20 63 6f 73 74 20        **   cost 
310c0 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67  = (3.0 * N * log
310d0 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20 20 20  (N)) * (Y/X).   
310e0 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
310f0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 28          ** The (
31100 59 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d 70  Y/X) term is imp
31110 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 73  lemented using s
31120 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72 53  tack variable rS
31130 63 61 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  cale.           
31140 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20   ** below.  */. 
31150 20 20 20 20 20 20 20 20 20 20 20 4c 6f 67 45 73             LogEs
31160 74 20 72 53 63 61 6c 65 2c 20 72 53 6f 72 74 43  t rScale, rSortC
31170 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ost;.           
31180 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42   assert( nOrderB
31190 79 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c 69 74  y>0 && 66==sqlit
311a0 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b  e3LogEst(100) );
311b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 53 63  .            rSc
311c0 61 6c 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ale = sqlite3Log
311d0 45 73 74 28 28 6e 4f 72 64 65 72 42 79 2d 69 73  Est((nOrderBy-is
311e0 4f 72 64 65 72 65 64 29 2a 31 30 30 2f 6e 4f 72  Ordered)*100/nOr
311f0 64 65 72 42 79 29 20 2d 20 36 36 3b 0a 20 20 20  derBy) - 66;.   
31200 20 20 20 20 20 20 20 20 20 72 53 6f 72 74 43 6f           rSortCo
31210 73 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 65  st = nRowEst + e
31220 73 74 4c 6f 67 28 6e 52 6f 77 45 73 74 29 20 2b  stLog(nRowEst) +
31230 20 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a 0a 20   rScale + 16;.. 
31240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55             /* TU
31250 4e 49 4e 47 3a 20 54 68 65 20 63 6f 73 74 20 6f  NING: The cost o
31260 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 44  f implementing D
31270 49 53 54 49 4e 43 54 20 75 73 69 6e 67 20 61 20  ISTINCT using a 
31280 42 2d 54 52 45 45 20 69 73 0a 20 20 20 20 20 20  B-TREE is.      
31290 20 20 20 20 20 20 2a 2a 20 73 69 6d 69 6c 61 72        ** similar
312a0 20 62 75 74 20 77 69 74 68 20 61 20 6c 61 72 67   but with a larg
312b0 65 72 20 63 6f 6e 73 74 61 6e 74 20 6f 66 20 70  er constant of p
312c0 72 6f 70 6f 72 74 69 6f 6e 61 6c 69 74 79 2e 20  roportionality. 
312d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
312e0 4d 75 6c 74 69 70 6c 79 20 62 79 20 61 6e 20 61  Multiply by an a
312f0 64 64 69 74 69 6f 6e 61 6c 20 66 61 63 74 6f 72  dditional factor
31300 20 6f 66 20 33 2e 30 2e 20 20 2a 2f 0a 20 20 20   of 3.0.  */.   
31310 20 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49           if( pWI
31320 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
31330 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
31340 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 20  TINCT ){.       
31350 20 20 20 20 20 20 20 72 53 6f 72 74 43 6f 73 74         rSortCost
31360 20 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20 20 20   += 16;.        
31370 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
31380 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30    WHERETRACE(0x0
31390 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  02,.            
313a0 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63     ("---- sort c
313b0 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64 29  ost=%-3d (%d/%d)
313c0 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20   increases cost 
313d0 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a  %3d to %-3d\n",.
313e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
313f0 72 53 6f 72 74 43 6f 73 74 2c 20 28 6e 4f 72 64  rSortCost, (nOrd
31400 65 72 42 79 2d 69 73 4f 72 64 65 72 65 64 29 2c  erBy-isOrdered),
31410 20 6e 4f 72 64 65 72 42 79 2c 20 72 43 6f 73 74   nOrderBy, rCost
31420 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31430 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
31440 64 64 28 72 43 6f 73 74 2c 72 53 6f 72 74 43 6f  dd(rCost,rSortCo
31450 73 74 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  st)));.         
31460 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74     rCost = sqlit
31470 65 33 4c 6f 67 45 73 74 41 64 64 28 72 43 6f 73  e3LogEstAdd(rCos
31480 74 2c 20 72 53 6f 72 74 43 6f 73 74 29 3b 0a 20  t, rSortCost);. 
31490 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
314a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
314b0 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46      revMask = pF
314c0 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20  rom->revLoop;.  
314d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
314e0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
314f0 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64  if pWLoop should
31500 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
31510 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74 20 73   mxChoice best s
31520 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
31530 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61   for(jj=0, pTo=a
31540 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b  To; jj<nTo; jj++
31550 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
31560 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73      if( pTo->mas
31570 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20  kLoop==maskNew. 
31580 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28 70            && ((p
31590 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73  To->isOrdered^is
315a0 4f 72 64 65 72 65 64 29 26 38 30 29 3d 3d 30 0a  Ordered)&80)==0.
315b0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28             && ((
315c0 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73  pTo->rCost<=rCos
315d0 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d  t && pTo->nRow<=
315e0 6e 4f 75 74 29 20 7c 7c 0a 20 20 20 20 20 20 20  nOut) ||.       
315f0 20 20 20 20 20 20 20 20 20 28 70 54 6f 2d 3e 72           (pTo->r
31600 43 6f 73 74 3e 3d 72 43 6f 73 74 20 26 26 20 70  Cost>=rCost && p
31610 54 6f 2d 3e 6e 52 6f 77 3e 3d 6e 4f 75 74 29 29  To->nRow>=nOut))
31620 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
31630 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
31640 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b  se( jj==nTo-1 );
31650 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
31660 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
31670 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31680 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b    if( jj>=nTo ){
31690 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
316a0 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 26 26 20  To>=mxChoice && 
316b0 72 43 6f 73 74 3e 3d 6d 78 43 6f 73 74 20 29 7b  rCost>=mxCost ){
316c0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
316d0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
316e0 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  4 */.           
316f0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
31700 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
31710 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31720 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
31730 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25  Skip   %s cost=%
31740 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
31750 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
31760 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
31770 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
31780 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
31790 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20  t, nOut,.       
317a0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
317b0 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
317c0 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
317d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65              }.#e
317e0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
317f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
31800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31810 20 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 50 61   /* Add a new Pa
31820 74 68 20 74 6f 20 74 68 65 20 61 54 6f 5b 5d 20  th to the aTo[] 
31830 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  set */.         
31840 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63   if( nTo<mxChoic
31850 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
31860 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65   /* Increase the
31870 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f   size of the aTo
31880 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20   set by one */. 
31890 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20             jj = 
318a0 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  nTo++;.         
318b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
318c0 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20      /* New path 
318d0 72 65 70 6c 61 63 65 73 20 74 68 65 20 70 72 69  replaces the pri
318e0 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70  or worst to keep
318f0 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43   count below mxC
31900 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20  hoice */.       
31910 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20       jj = mxI;. 
31920 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31930 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b       pTo = &aTo[
31940 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52  jj];.#ifdef WHER
31950 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
31960 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20  * 0x4 */.       
31970 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
31980 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
31990 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
319a0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
319b0 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25  New    %s cost=%
319c0 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
319d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
319e0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
319f0 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
31a00 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
31a10 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
31a20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
31a30 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
31a40 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
31a50 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
31a60 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
31a70 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
31a80 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20 26 26  >rCost<=rCost &&
31a90 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74   pTo->nRow<=nOut
31aa0 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45   ){.#ifdef WHERE
31ab0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
31ac0 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
31ad0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
31ae0 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
31af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
31b00 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
31b10 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
31b20 20 20 20 20 20 22 53 6b 69 70 20 20 20 25 73 20       "Skip   %s 
31b30 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
31b40 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
31b50 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
31b60 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
31b70 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
31b80 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20  rCost, nOut,.   
31b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
31ba0 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
31bb0 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
31bc0 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
31bd0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
31be0 69 6e 74 66 28 22 20 20 20 76 73 20 25 73 20 63  intf("   vs %s c
31bf0 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65  ost=%-3d,%d orde
31c00 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20  r=%c\n",.       
31c10 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
31c20 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
31c30 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
31c40 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
31c50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31c60 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
31c70 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f  ed>=0 ? pTo->isO
31c80 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
31c90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
31ca0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
31cb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
31cc0 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20  o->rCost==rCost 
31cd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  );.            c
31ce0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
31cf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
31d00 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43  estcase( pTo->rC
31d10 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a  ost==rCost+1 );.
31d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e            /* A n
31d30 65 77 20 61 6e 64 20 62 65 74 74 65 72 20 73 63  ew and better sc
31d40 6f 72 65 20 66 6f 72 20 61 20 70 72 65 76 69 6f  ore for a previo
31d50 75 73 6c 79 20 63 72 65 61 74 65 64 20 65 71 75  usly created equ
31d60 69 76 61 6c 65 6e 74 20 70 61 74 68 20 2a 2f 0a  ivalent path */.
31d70 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
31d80 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
31d90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
31da0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
31db0 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
31dc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
31dd0 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20  bugPrintf(.     
31de0 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64 61             "Upda
31df0 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c  te %s cost=%-3d,
31e00 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  %3d order=%c",. 
31e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
31e20 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
31e30 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
31e40 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
31e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31e60 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
31e70 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
31e80 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
31e90 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
31ea0 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20 63  intf("  was %s c
31eb0 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
31ec0 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
31ed0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
31ee0 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
31ef0 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
31f00 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
31f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31f20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
31f30 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65  =0 ? pTo->isOrde
31f40 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
31f50 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
31f60 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
31f70 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69       /* pWLoop i
31f80 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64  s a winner.  Add
31f90 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f   it to the set o
31fa0 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f  f best so far */
31fb0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61  .        pTo->ma
31fc0 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e  skLoop = pFrom->
31fd0 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f  maskLoop | pWLoo
31fe0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
31ff0 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f       pTo->revLoo
32000 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  p = revMask;.   
32010 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d       pTo->nRow =
32020 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70   nOut;.        p
32030 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73  To->rCost = rCos
32040 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
32050 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72  isOrdered = isOr
32060 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d  dered;.        m
32070 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70  emcpy(pTo->aLoop
32080 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20  , pFrom->aLoop, 
32090 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
320a0 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  *)*iLoop);.     
320b0 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c     pTo->aLoop[iL
320c0 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20  oop] = pWLoop;. 
320d0 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
320e0 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
320f0 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20        mxI = 0;. 
32100 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
32110 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a  = aTo[0].rCost;.
32120 20 20 20 20 20 20 20 20 20 20 6d 78 4f 75 74 20            mxOut 
32130 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20  = aTo[0].nRow;. 
32140 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d           for(jj=
32150 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20  1, pTo=&aTo[1]; 
32160 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b  jj<mxChoice; jj+
32170 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
32180 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
32190 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20  rCost>mxCost || 
321a0 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43  (pTo->rCost==mxC
321b0 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77  ost && pTo->nRow
321c0 3e 6d 78 4f 75 74 29 20 29 7b 0a 20 20 20 20 20  >mxOut) ){.     
321d0 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
321e0 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20  = pTo->rCost;.  
321f0 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 4f 75              mxOu
32200 74 20 3d 20 70 54 6f 2d 3e 6e 52 6f 77 3b 0a 20  t = pTo->nRow;. 
32210 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 49               mxI
32220 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20   = jj;.         
32230 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
32240 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32250 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66   }.    }..#ifdef
32260 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
32270 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20  LED  /* >=2 */. 
32280 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
32290 65 72 65 54 72 61 63 65 3e 3d 32 20 29 7b 0a 20  ereTrace>=2 ){. 
322a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
322b0 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66  gPrintf("---- af
322c0 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d  ter round %d ---
322d0 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20  -\n", iLoop);.  
322e0 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54      for(ii=0, pT
322f0 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69  o=aTo; ii<nTo; i
32300 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  i++, pTo++){.   
32310 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
32320 67 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73  gPrintf(" %s cos
32330 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64  t=%-3d nrow=%-3d
32340 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
32350 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
32360 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
32370 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
32380 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20  t, pTo->nRow,.  
32390 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73           pTo->is
323a0 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 28 70 54  Ordered>=0 ? (pT
323b0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27  o->isOrdered+'0'
323c0 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
323d0 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64    if( pTo->isOrd
323e0 65 72 65 64 3e 30 20 29 7b 0a 20 20 20 20 20 20  ered>0 ){.      
323f0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
32400 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25  Printf(" rev=0x%
32410 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76  llx\n", pTo->rev
32420 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  Loop);.        }
32430 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
32440 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
32450 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  tf("\n");.      
32460 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
32470 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
32480 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20   Swap the roles 
32490 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f  of aFrom and aTo
324a0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65   for the next ge
324b0 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  neration */.    
324c0 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20  pFrom = aTo;.   
324d0 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20   aTo = aFrom;.  
324e0 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b    aFrom = pFrom;
324f0 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f  .    nFrom = nTo
32500 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72  ;.  }..  if( nFr
32510 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  om==0 ){.    sql
32520 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
32530 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73  rse, "no query s
32540 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73  olution");.    s
32550 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
32560 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65   pSpace);.    re
32570 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
32580 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46  R;.  }.  .  /* F
32590 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  ind the lowest c
325a0 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d  ost path.  pFrom
325b0 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f   will be left po
325c0 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70  inting to that p
325d0 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d  ath */.  pFrom =
325e0 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69   aFrom;.  for(ii
325f0 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69  =1; ii<nFrom; ii
32600 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72  ++){.    if( pFr
32610 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b  om->rCost>aFrom[
32620 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f  ii].rCost ) pFro
32630 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a  m = &aFrom[ii];.
32640 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57    }.  assert( pW
32650 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c  Info->nLevel==nL
32660 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64  oop );.  /* Load
32670 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
32680 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66   path into pWInf
32690 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  o */.  for(iLoop
326a0 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b  =0; iLoop<nLoop;
326b0 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57   iLoop++){.    W
326c0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
326d0 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20  l = pWInfo->a + 
326e0 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65  iLoop;.    pLeve
326f0 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f  l->pWLoop = pWLo
32700 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  op = pFrom->aLoo
32710 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c  p[iLoop];.    pL
32720 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57  evel->iFrom = pW
32730 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20  Loop->iTab;.    
32740 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
32750 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
32760 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
32770 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  rom].iCursor;.  
32780 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d  }.  if( (pWInfo-
32790 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
327a0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
327b0 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49  T)!=0.   && (pWI
327c0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
327d0 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
327e0 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49  BY)==0.   && pWI
327f0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
32800 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
32810 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73  OOP.   && nRowEs
32820 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  t.  ){.    Bitma
32830 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  sk notUsed;.    
32840 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61  int rc = wherePa
32850 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
32860 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  By(pWInfo, pWInf
32870 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70  o->pResultSet, p
32880 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  From,.          
32890 20 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53         WHERE_DIS
328a0 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31  TINCTBY, nLoop-1
328b0 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e  , pFrom->aLoop[n
328c0 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65  Loop-1], &notUse
328d0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
328e0 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
328f0 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  et->nExpr ){.   
32900 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
32910 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
32920 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
32930 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
32940 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
32950 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ){.    if( pWInf
32960 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
32970 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
32980 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46   ){.      if( pF
32990 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d  rom->isOrdered==
329a0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
329b0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
329c0 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
329d0 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
329e0 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
329f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
32a00 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
32a10 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e  nOBSat = pFrom->
32a20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
32a30 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42   if( pWInfo->nOB
32a40 53 61 74 3c 30 20 29 20 70 57 49 6e 66 6f 2d 3e  Sat<0 ) pWInfo->
32a50 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20 20 20  nOBSat = 0;.    
32a60 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
32a70 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f  k = pFrom->revLo
32a80 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  op;.    }.    if
32a90 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
32aa0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f  Flags & WHERE_SO
32ab0 52 54 42 59 47 52 4f 55 50 29 0a 20 20 20 20 20  RTBYGROUP).     
32ac0 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f     && pWInfo->nO
32ad0 42 53 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  BSat==pWInfo->pO
32ae0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 0a 20 20  rderBy->nExpr.  
32af0 20 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61    ){.      Bitma
32b00 73 6b 20 6e 6f 74 55 73 65 64 20 3d 20 30 3b 0a  sk notUsed = 0;.
32b10 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72        int nOrder
32b20 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
32b30 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
32b40 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  nfo, pWInfo->pOr
32b50 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20  derBy, .        
32b60 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f    pFrom, 0, nLoo
32b70 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
32b80 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74  p[nLoop-1], &not
32b90 55 73 65 64 0a 20 20 20 20 20 20 29 3b 0a 20 20  Used.      );.  
32ba0 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
32bb0 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b  fo->sorted==0 );
32bc0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73  .      pWInfo->s
32bd0 6f 72 74 65 64 20 3d 20 28 6e 4f 72 64 65 72 3d  orted = (nOrder=
32be0 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  =pWInfo->pOrderB
32bf0 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 7d  y->nExpr);.    }
32c00 0a 20 20 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d  .  }...  pWInfo-
32c10 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d  >nRowOut = pFrom
32c20 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72  ->nRow;..  /* Fr
32c30 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d  ee temporary mem
32c40 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73  ory and return s
32c50 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69  uccess */.  sqli
32c60 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
32c70 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  pace);.  return 
32c80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
32c90 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73  .** Most queries
32ca0 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67   use only a sing
32cb0 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79 20 61  le table (they a
32cc0 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e  re not joins) an
32cd0 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65  d have.** simple
32ce0 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
32cf0 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20  against indexed 
32d00 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f  fields.  This ro
32d10 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a  utine attempts.*
32d20 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20  * to plan those 
32d30 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69  simple cases usi
32d40 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72  ng much less cer
32d50 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a  emony than the.*
32d60 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
32d70 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c  e query planner,
32d80 20 61 6e 64 20 74 68 65 72 65 62 79 20 79 69 65   and thereby yie
32d90 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69 74 65  ld faster sqlite
32da0 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74  3_prepare().** t
32db0 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d  imes for the com
32dc0 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  mon case..**.** 
32dd0 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
32de0 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20 74  on success, if t
32df0 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65  his query can be
32e00 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73   handled by this
32e10 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75  .** no-frills qu
32e20 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65  ery planner.  Re
32e30 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69  turn zero if thi
32e40 73 20 71 75 65 72 79 20 6e 65 65 64 73 20 74 68  s query needs th
32e50 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  e .** general-pu
32e60 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
32e70 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ner..*/.static i
32e80 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43 75 74  nt whereShortCut
32e90 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
32ea0 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
32eb0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
32ec0 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  o;.  struct SrcL
32ed0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
32ee0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
32ef0 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  pWC;.  WhereTerm
32f00 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65   *pTerm;.  Where
32f10 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69  Loop *pLoop;.  i
32f20 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a  nt iCur;.  int j
32f30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
32f40 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
32f50 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42    .  pWInfo = pB
32f60 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
32f70 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
32f80 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
32f90 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 29 20 72  _FORCE_TABLE ) r
32fa0 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
32fb0 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  t( pWInfo->pTabL
32fc0 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a  ist->nSrc>=1 );.
32fd0 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f    pItem = pWInfo
32fe0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  ->pTabList->a;. 
32ff0 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70   pTab = pItem->p
33000 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69 72  Tab;.  if( IsVir
33010 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
33020 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 74  urn 0;.  if( pIt
33030 65 6d 2d 3e 7a 49 6e 64 65 78 20 29 20 72 65 74  em->zIndex ) ret
33040 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d 20  urn 0;.  iCur = 
33050 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
33060 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d    pWC = &pWInfo-
33070 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  >sWC;.  pLoop = 
33080 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
33090 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
330a0 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75   = 0;.  pLoop->u
330b0 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20 30  .btree.nSkip = 0
330c0 3b 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64  ;.  pTerm = find
330d0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
330e0 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 30 29  -1, 0, WO_EQ, 0)
330f0 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b  ;.  if( pTerm ){
33100 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
33110 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
33120 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c  MN_EQ|WHERE_IPK|
33130 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
33140 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
33150 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
33160 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
33170 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  1;.    pLoop->u.
33180 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
33190 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
331a0 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f  st of a rowid lo
331b0 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20  okup is 10 */.  
331c0 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20    pLoop->rRun = 
331d0 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69  33;  /* 33==sqli
331e0 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f  te3LogEst(10) */
331f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
33200 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
33210 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
33220 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
33230 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
33240 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d  p->aLTermSpace==
33250 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b  pLoop->aLTerm );
33260 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 41  .      assert( A
33270 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e  rraySize(pLoop->
33280 61 4c 54 65 72 6d 53 70 61 63 65 29 3d 3d 34 20  aLTermSpace)==4 
33290 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
332a0 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e  x->onError==OE_N
332b0 6f 6e 65 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  one .       || p
332c0 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
332d0 72 65 21 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c  re!=0 .       ||
332e0 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41   pIdx->nKeyCol>A
332f0 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e  rraySize(pLoop->
33300 61 4c 54 65 72 6d 53 70 61 63 65 29 20 0a 20 20  aLTermSpace) .  
33310 20 20 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a      ) continue;.
33320 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
33330 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
33340 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54  j++){.        pT
33350 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
33360 57 43 2c 20 69 43 75 72 2c 20 70 49 64 78 2d 3e  WC, iCur, pIdx->
33370 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20  aiColumn[j], 0, 
33380 57 4f 5f 45 51 2c 20 70 49 64 78 29 3b 0a 20 20  WO_EQ, pIdx);.  
33390 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
333a0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
333b0 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
333c0 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[j] = pTerm;.  
333d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
333e0 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  j!=pIdx->nKeyCol
333f0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
33400 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
33410 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
33420 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  _EQ|WHERE_ONEROW
33430 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a  |WHERE_INDEXED;.
33440 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
33450 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70  isCovering || (p
33460 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20  Item->colUsed & 
33470 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28  ~columnsInIndex(
33480 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20  pIdx))==0 ){.   
33490 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c       pLoop->wsFl
334a0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58  ags |= WHERE_IDX
334b0 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20  _ONLY;.      }. 
334c0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65       pLoop->nLTe
334d0 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c  rm = j;.      pL
334e0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
334f0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f   = j;.      pLoo
33500 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
33510 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  x = pIdx;.      
33520 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
33530 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  of a unique inde
33540 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a  x lookup is 15 *
33550 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72  /.      pLoop->r
33560 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39  Run = 39;  /* 39
33570 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
33580 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  15) */.      bre
33590 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
335a0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
335b0 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d  gs ){.    pLoop-
335c0 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29  >nOut = (LogEst)
335d0 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
335e0 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f  [0].pWLoop = pLo
335f0 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d  op;.    pLoop->m
33600 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73  askSelf = getMas
33610 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
33620 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  Set, iCur);.    
33630 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61  pWInfo->a[0].iTa
33640 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20  bCur = iCur;.   
33650 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
33660 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57   = 1;.    if( pW
33670 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
33680 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20   pWInfo->nOBSat 
33690 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  =  pWInfo->pOrde
336a0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
336b0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  if( pWInfo->wctr
336c0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
336d0 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
336e0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
336f0 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
33700 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
33710 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
33720 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70  LITE_DEBUG.    p
33730 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b  Loop->cId = '0';
33740 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
33750 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
33760 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
33770 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69  enerate the begi
33780 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f  nning of the loo
33790 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45  p used for WHERE
337a0 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
337b0 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ng..** The retur
337c0 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69  n value is a poi
337d0 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75  nter to an opaqu
337e0 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
337f0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66   contains.** inf
33800 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ormation needed 
33810 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
33820 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74   loop.  Later, t
33830 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
33840 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76  ne.** should inv
33850 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65  oke sqlite3Where
33860 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72  End() with the r
33870 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
33880 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
33890 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70  in order to comp
338a0 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63  lete the WHERE c
338b0 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
338c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
338d0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73  ror occurs, this
338e0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
338f0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
33900 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74   basic idea is t
33910 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f  o do a nested lo
33920 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72  op, one loop for
33930 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a   each table in.*
33940 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
33950 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  e of a select.  
33960 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41  (INSERT and UPDA
33970 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  TE statements ar
33980 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73  e the.** same as
33990 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f   a SELECT with o
339a0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
339b0 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
339c0 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20  lause.)  For.** 
339d0 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
339e0 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a  SQL is this:.**.
339f0 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  **       SELECT 
33a00 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74  * FROM t1, t2, t
33a10 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a  3 WHERE ...;.**.
33a20 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65  ** Then the code
33a30 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f   generated is co
33a40 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20  nceptually like 
33a50 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
33a60 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  *.**      foreac
33a70 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20  h row1 in t1 do 
33a80 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
33a90 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
33aa0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
33ab0 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c   in t2 do      |
33ac0 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
33ad0 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20  reBegin().**    
33ae0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
33af0 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a  w3 in t3 do   /.
33b00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e  **            ..
33b10 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e  ..**          en
33b20 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
33b30 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
33b40 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
33b50 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
33b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
33b70 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
33b80 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20  reEnd().**      
33b90 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
33ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a              /.**
33bb0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
33bc0 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f  e loops might no
33bd0 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74  t be nested in t
33be0 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63  he order in whic
33bf0 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72  h they.** appear
33c00 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
33c10 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65  use if a differe
33c20 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74  nt order is bett
33c30 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a  er able to make.
33c40 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65  ** use of indice
33c50 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  s.  Note also th
33c60 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f  at when the IN o
33c70 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20  perator appears 
33c80 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  in.** the WHERE 
33c90 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74  clause, it might
33ca0 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74   result in addit
33cb0 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f  ional nested loo
33cc0 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69  ps for.** scanni
33cd0 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76  ng through all v
33ce0 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67  alues on the rig
33cf0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
33d00 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68  the IN..**.** Th
33d10 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75  ere are Btree cu
33d20 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
33d30 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65   with each table
33d40 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f  .  t1 uses curso
33d50 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62  r.** number pTab
33d60 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
33d70 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65  or.  t2 uses the
33d80 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74   cursor pTabList
33d90 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a  ->a[1].iCursor..
33da0 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  ** And so forth.
33db0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67    This routine g
33dc0 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
33dd0 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45   open those VDBE
33de0 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20   cursors.** and 
33df0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
33e00 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  ) generates the 
33e10 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68  code to close th
33e20 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  em..**.** The co
33e30 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57  de that sqlite3W
33e40 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65  hereBegin() gene
33e50 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65  rates leaves the
33e60 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a   cursors named.*
33e70 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f  * in pTabList po
33e80 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20  inting at their 
33e90 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72  appropriate entr
33ea0 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20  ies.  The [...] 
33eb0 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20  code.** can use 
33ec0 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50  OP_Column and OP
33ed0 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f  _Rowid opcodes o
33ee0 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20  n these cursors 
33ef0 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61  to extract.** da
33f00 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69  ta from the vari
33f10 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68  ous tables of th
33f20 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66  e loop..**.** If
33f30 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
33f40 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
33f50 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75  foreach loops mu
33f60 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65  st each scan the
33f70 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62  ir.** entire tab
33f80 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72  les.  Thus a thr
33f90 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61  ee-way join is a
33fa0 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69  n O(N^3) operati
33fb0 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74  on.  But if.** t
33fc0 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  he tables have i
33fd0 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65  ndices and there
33fe0 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68   are terms in th
33ff0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
34000 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20  hat.** refer to 
34010 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61  those indices, a
34020 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20   complete table 
34030 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69  scan can be avoi
34040 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  ded and the.** c
34050 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63  ode will run muc
34060 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20  h faster.  Most 
34070 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74  of the work of t
34080 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
34090 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65  hecking.** to se
340a0 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  e if there are i
340b0 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20  ndices that can 
340c0 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64  be used to speed
340d0 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   up the loop..**
340e0 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65  .** Terms of the
340f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72   WHERE clause ar
34100 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c  e also used to l
34110 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20  imit which rows 
34120 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  actually.** make
34130 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22   it to the "..."
34140 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
34150 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74  f the loop.  Aft
34160 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68  er each "foreach
34170 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74  ",.** terms of t
34180 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
34190 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65  that use only te
341a0 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70  rms in that loop
341b0 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f   and outer.** lo
341c0 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65  ops are evaluate
341d0 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61  d and if false a
341e0 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72   jump is made ar
341f0 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75  ound all subsequ
34200 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f  ent.** inner loo
34210 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68  ps (or around th
34220 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74  e "..." if the t
34230 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69  est occurs withi
34240 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20  n the inner-.** 
34250 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a  most loop).**.**
34260 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a   OUTER JOINS.**.
34270 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  ** An outer join
34280 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e   of tables t1 an
34290 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61  d t2 is concepta
342a0 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c  lly coded as fol
342b0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66  lows:.**.**    f
342c0 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
342d0 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61  1 do.**      fla
342e0 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f  g = 0.**      fo
342f0 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
34300 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74   do.**        st
34310 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  art:.**         
34320 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
34330 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20   flag = 1.**    
34340 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66    end.**      if
34350 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a   flag==0 then.**
34360 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65          move the
34370 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20   row2 cursor to 
34380 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20  a null row.**   
34390 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a       goto start.
343a0 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20  **      fi.**   
343b0 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52   end.**.** ORDER
343c0 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45   BY CLAUSE PROCE
343d0 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64  SSING.**.** pOrd
343e0 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65  erBy is a pointe
343f0 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  r to the ORDER B
34400 59 20 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65  Y clause (or the
34410 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
34420 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45  .** if the WHERE
34430 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73  _GROUPBY flag is
34440 20 73 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61   set in wctrlFla
34450 67 73 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20  gs) of a SELECT 
34460 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20  statement.** if 
34470 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49  there is one.  I
34480 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  f there is no OR
34490 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
344a0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
344b0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72  .** is called fr
344c0 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  om an UPDATE or 
344d0 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
344e0 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20  , then pOrderBy 
344f0 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  is NULL..**.** T
34500 68 65 20 69 49 64 78 43 75 72 20 70 61 72 61 6d  he iIdxCur param
34510 65 74 65 72 20 69 73 20 74 68 65 20 63 75 72 73  eter is the curs
34520 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  or number of an 
34530 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57  index.  If .** W
34540 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
34550 4c 59 20 69 73 20 73 65 74 2c 20 69 49 64 78 43  LY is set, iIdxC
34560 75 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72  ur is the cursor
34570 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e   number of an in
34580 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f  dex.** to use fo
34590 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63  r OR clause proc
345a0 65 73 73 69 6e 67 2e 20 20 54 68 65 20 57 48 45  essing.  The WHE
345b0 52 45 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  RE clause should
345c0 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 73 70 65   use this.** spe
345d0 63 69 66 69 63 20 63 75 72 73 6f 72 2e 20 20 49  cific cursor.  I
345e0 66 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  f WHERE_ONEPASS_
345f0 44 45 53 49 52 45 44 20 69 73 20 73 65 74 2c 20  DESIRED is set, 
34600 74 68 65 6e 20 69 49 64 78 43 75 72 20 69 73 0a  then iIdxCur is.
34610 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 75 72  ** the first cur
34620 73 6f 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20  sor in an array 
34630 6f 66 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61  of cursors for a
34640 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20 69 49 64  ll indices.  iId
34650 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  xCur should.** b
34660 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  e used to comput
34670 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  e the appropriat
34680 65 20 63 75 72 73 6f 72 20 64 65 70 65 6e 64 69  e cursor dependi
34690 6e 67 20 6f 6e 20 77 68 69 63 68 20 69 6e 64 65  ng on which inde
346a0 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f  x is.** used..*/
346b0 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69  .WhereInfo *sqli
346c0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20  te3WhereBegin(. 
346d0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
346e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
346f0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
34700 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
34710 69 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20  ist,    /* FROM 
34720 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f  clause: A list o
34730 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  f all tables to 
34740 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
34750 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
34760 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
34770 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
34780 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
34790 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52  y,   /* An ORDER
347a0 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
347b0 29 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c  ) clause, or NUL
347c0 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
347d0 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20  *pResultSet, /* 
347e0 52 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  Result set of th
347f0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 75 31 36  e query */.  u16
34800 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
34810 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
34820 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64   WHERE_* flags d
34830 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
34840 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69  Int.h */.  int i
34850 49 64 78 43 75 72 20 20 20 20 20 20 20 20 20 20  IdxCur          
34860 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e 45   /* If WHERE_ONE
34870 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65  TABLE_ONLY is se
34880 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  t, index cursor 
34890 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  number */.){.  i
348a0 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20  nt nByteWInfo;  
348b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
348c0 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  . bytes allocate
348d0 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20  d for WhereInfo 
348e0 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20  struct */.  int 
348f0 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20  nTabList;       
34900 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
34910 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
34920 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
34930 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
34940 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c           /* Will
34950 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75   become the retu
34960 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
34970 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56   function */.  V
34980 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
34990 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65  >pVdbe;   /* The
349a0 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73   virtual databas
349b0 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69  e engine */.  Bi
349c0 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20  tmask notReady; 
349d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
349e0 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
349f0 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20   yet positioned 
34a00 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
34a10 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20  ilder sWLB;     
34a20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70  /* The WhereLoop
34a30 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68   builder */.  Wh
34a40 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
34a50 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  kSet;    /* The 
34a60 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20  expression mask 
34a70 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  set */.  WhereLe
34a80 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20  vel *pLevel;    
34a90 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
34aa0 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d  level in pWInfo-
34ab0 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  >a[] */.  WhereL
34ac0 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
34ad0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
34ae0 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72  to a single Wher
34af0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
34b00 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
34b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34b20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
34b30 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
34b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34b50 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
34b60 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ion */.  int rc;
34b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b80 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
34b90 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72  de */...  /* Var
34ba0 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61  iable initializa
34bb0 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70  tion */.  db = p
34bc0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d  Parse->db;.  mem
34bd0 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69  set(&sWLB, 0, si
34be0 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20  zeof(sWLB));..  
34bf0 2f 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55  /* An ORDER/GROU
34c00 50 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d  P BY clause of m
34c10 6f 72 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d  ore than 63 term
34c20 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69  s cannot be opti
34c30 6d 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63  mized */.  testc
34c40 61 73 65 28 20 70 4f 72 64 65 72 42 79 20 26 26  ase( pOrderBy &&
34c50 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
34c60 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28  ==BMS-1 );.  if(
34c70 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72   pOrderBy && pOr
34c80 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d  derBy->nExpr>=BM
34c90 53 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30  S ) pOrderBy = 0
34ca0 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42  ;.  sWLB.pOrderB
34cb0 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20  y = pOrderBy;.. 
34cc0 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20   /* Disable the 
34cd0 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a  DISTINCT optimiz
34ce0 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ation if SQLITE_
34cf0 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73  DistinctOpt is s
34d00 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69  et via.  ** sqli
34d10 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51  te3_test_ctrl(SQ
34d20 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
34d30 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29  TIMIZATIONS,...)
34d40 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
34d50 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
34d60 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  b, SQLITE_Distin
34d70 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63  ctOpt) ){.    wc
34d80 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  trlFlags &= ~WHE
34d90 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
34da0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
34db0 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  number of tables
34dc0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
34dd0 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
34de0 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
34df0 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42    ** bits in a B
34e00 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74  itmask .  */.  t
34e10 65 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73  estcase( pTabLis
34e20 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a  t->nSrc==BMS );.
34e30 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
34e40 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20  nSrc>BMS ){.    
34e50 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
34e60 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74  pParse, "at most
34e70 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20   %d tables in a 
34e80 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20  join", BMS);.   
34e90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
34ea0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
34eb0 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65  on normally gene
34ec0 72 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c  rates a nested l
34ed0 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  oop for all tabl
34ee0 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62  es in .  ** pTab
34ef0 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68  List.  But if th
34f00 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  e WHERE_ONETABLE
34f10 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
34f20 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c  t, then we shoul
34f30 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65  d.  ** only gene
34f40 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
34f50 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e  e first table in
34f60 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73   pTabList and as
34f70 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61  sume that.  ** a
34f80 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ny cursors assoc
34f90 69 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65  iated with subse
34fa0 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65  quent tables are
34fb0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
34fc0 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20    */.  nTabList 
34fd0 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  = (wctrlFlags & 
34fe0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
34ff0 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c  NLY) ? 1 : pTabL
35000 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a  ist->nSrc;..  /*
35010 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
35020 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65  itialize the Whe
35030 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
35040 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
35050 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72  e the.  ** retur
35060 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c  n value. A singl
35070 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
35080 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
35090 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a  e WhereInfo.  **
350a0 20 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e   struct, the con
350b0 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e  tents of WhereIn
350c0 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72  fo.a[], the Wher
350d0 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
350e0 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57  e.  ** and the W
350f0 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
35100 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65  cture. Since Whe
35110 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  reClause contain
35120 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a  s an 8-byte.  **
35130 20 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74   field (type Bit
35140 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65  mask) it must be
35150 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38   aligned on an 8
35160 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f  -byte boundary o
35170 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68  n.  ** some arch
35180 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65  itectures. Hence
35190 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65   the ROUND8() be
351a0 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74  low..  */.  nByt
351b0 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28  eWInfo = ROUND8(
351c0 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f  sizeof(WhereInfo
351d0 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73  )+(nTabList-1)*s
351e0 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c  izeof(WhereLevel
351f0 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73  ));.  pWInfo = s
35200 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
35210 72 6f 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66  ro(db, nByteWInf
35220 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65  o + sizeof(Where
35230 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62  Loop));.  if( db
35240 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
35250 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
35260 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
35270 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b  .    pWInfo = 0;
35280 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
35290 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20  eginError;.  }. 
352a0 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
352b0 65 50 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66  ePass[0] = pWInf
352c0 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
352d0 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66  1] = -1;.  pWInf
352e0 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62  o->nLevel = nTab
352f0 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
35300 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
35310 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  .  pWInfo->pTabL
35320 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
35330 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
35340 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
35350 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74   pWInfo->pResult
35360 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53 65 74  Set = pResultSet
35370 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ;.  pWInfo->iBre
35380 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  ak = pWInfo->iCo
35390 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
353a0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
353b0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  ;.  pWInfo->wctr
353c0 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c  lFlags = wctrlFl
353d0 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73  ags;.  pWInfo->s
353e0 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
353f0 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
35400 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20  oop;.  pMaskSet 
35410 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  = &pWInfo->sMask
35420 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e  Set;.  sWLB.pWIn
35430 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73  fo = pWInfo;.  s
35440 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66  WLB.pWC = &pWInf
35450 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70  o->sWC;.  sWLB.p
35460 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70  New = (WhereLoop
35470 2a 29 28 28 28 63 68 61 72 2a 29 70 57 49 6e 66  *)(((char*)pWInf
35480 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a  o)+nByteWInfo);.
35490 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
354a0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73  BYTE_ALIGNMENT(s
354b0 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77  WLB.pNew) );.  w
354c0 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c  hereLoopInit(sWL
354d0 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20  B.pNew);.#ifdef 
354e0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73  SQLITE_DEBUG.  s
354f0 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20  WLB.pNew->cId = 
35500 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  '*';.#endif..  /
35510 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52  * Split the WHER
35520 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65  E clause into se
35530 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73  parate subexpres
35540 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68  sions where each
35550 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73  .  ** subexpress
35560 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
35570 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   by an AND opera
35580 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74  tor..  */.  init
35590 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74  MaskSet(pMaskSet
355a0 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  );.  whereClause
355b0 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57  Init(&pWInfo->sW
355c0 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68  C, pWInfo);.  wh
355d0 65 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f  ereSplit(&pWInfo
355e0 2d 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54  ->sWC, pWhere, T
355f0 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f  K_AND);.    .  /
35600 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
35610 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
35620 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  hat is constant.
35630 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20    Evaluate the. 
35640 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61   ** expression a
35650 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f  nd either jump o
35660 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ver all of the c
35670 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75  ode or fall thru
35680 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
35690 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d 3e  0; ii<sWLB.pWC->
356a0 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
356b0 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d    if( nTabList==
356c0 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72  0 || sqlite3Expr
356d0 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
356e0 6e 28 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69  n(sWLB.pWC->a[ii
356f0 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
35700 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
35710 61 6c 73 65 28 70 50 61 72 73 65 2c 20 73 57 4c  alse(pParse, sWL
35720 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78  B.pWC->a[ii].pEx
35730 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  pr, pWInfo->iBre
35740 61 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak,.            
35750 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
35760 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
35770 0a 20 20 20 20 20 20 73 57 4c 42 2e 70 57 43 2d  .      sWLB.pWC-
35780 3e 61 5b 69 69 5d 2e 77 74 46 6c 61 67 73 20 7c  >a[ii].wtFlags |
35790 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
357a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70    }.  }..  /* Sp
357b0 65 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46  ecial case: No F
357c0 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
357d0 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d    if( nTabList==
357e0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72  0 ){.    if( pOr
357f0 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e  derBy ) pWInfo->
35800 6e 4f 42 53 61 74 20 3d 20 70 4f 72 64 65 72 42  nOBSat = pOrderB
35810 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66  y->nExpr;.    if
35820 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
35830 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
35840 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  CT ){.      pWIn
35850 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
35860 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
35870 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  NIQUE;.    }.  }
35880 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20  ..  /* Assign a 
35890 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74  bit from the bit
358a0 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65  mask to every te
358b0 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  rm in the FROM c
358c0 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
358d0 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20   When assigning 
358e0 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74  bitmask values t
358f0 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75  o FROM clause cu
35900 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62  rsors, it must b
35910 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20  e.  ** the case 
35920 74 68 61 74 20 69 66 20 58 20 69 73 20 74 68 65  that if X is the
35930 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
35940 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73   N-th FROM claus
35950 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a  e term then.  **
35960 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
35970 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65   all FROM clause
35980 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65   terms to the le
35990 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74  ft of the N-th t
359a0 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31  erm.  ** is (X-1
359b0 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73 69  ).   An expressi
359c0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63  on from the ON c
359d0 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
359e0 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a  JOIN can use.  *
359f0 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68  * its Expr.iRigh
35a00 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65  tJoinTable value
35a10 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74   to find the bit
35a20 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68  mask of the righ
35a30 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20  t table.  ** of 
35a40 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72  the join.  Subtr
35a50 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20  acting one from 
35a60 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
35a70 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a  bitmask gives a.
35a80 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72    ** bitmask for
35a90 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74   all tables to t
35aa0 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a  he left of the j
35ab0 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68  oin.  Knowing th
35ac0 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66  e bitmask.  ** f
35ad0 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  or all tables to
35ae0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c   the left of a l
35af0 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f  eft join is impo
35b00 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23  rtant.  Ticket #
35b10 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3015..  **.  ** 
35b20 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73  Note that bitmas
35b30 6b 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66  ks are created f
35b40 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d  or all pTabList-
35b50 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a  >nSrc tables in.
35b60 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e    ** pTabList, n
35b70 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73  ot just the firs
35b80 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65  t nTabList table
35b90 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20  s.  nTabList is 
35ba0 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71  normally.  ** eq
35bb0 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d  ual to pTabList-
35bc0 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20  >nSrc but might 
35bd0 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20  be shortened to 
35be0 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48  1 if the.  ** WH
35bf0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
35c00 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20  Y flag is set.. 
35c10 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
35c20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ii<pTabList->nSr
35c30 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72  c; ii++){.    cr
35c40 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65  eateMask(pMaskSe
35c50 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
35c60 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d  i].iCursor);.  }
35c70 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
35c80 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20    {.    Bitmask 
35c90 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20  toTheLeft = 0;. 
35ca0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
35cb0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
35cc0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74  ii++){.      Bit
35cd0 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b  mask m = getMask
35ce0 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
35cf0 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73  ist->a[ii].iCurs
35d00 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  or);.      asser
35d10 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c  t( (m-1)==toTheL
35d20 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54  eft );.      toT
35d30 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20  heLeft |= m;.   
35d40 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
35d50 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20   /* Analyze all 
35d60 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73  of the subexpres
35d70 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61  sions.  Note tha
35d80 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20  t exprAnalyze() 
35d90 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e  might.  ** add n
35da0 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
35db0 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
35dc0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
35dd0 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20  e.  We do not.  
35de0 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79  ** want to analy
35df0 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c  ze these virtual
35e00 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74   terms, so start
35e10 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68   analyzing at th
35e20 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77  e end.  ** and w
35e30 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74  ork forward so t
35e40 68 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69  hat the added vi
35e50 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20  rtual terms are 
35e60 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e  never processed.
35e70 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c  .  */.  exprAnal
35e80 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c  yzeAll(pTabList,
35e90 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a   &pWInfo->sWC);.
35ea0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
35eb0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
35ec0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
35ed0 6f 72 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77  or;.  }..  if( w
35ee0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
35ef0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
35f00 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44 69 73  ){.    if( isDis
35f10 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70  tinctRedundant(p
35f20 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
35f30 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70   &pWInfo->sWC, p
35f40 52 65 73 75 6c 74 53 65 74 29 20 29 7b 0a 20 20  ResultSet) ){.  
35f50 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49      /* The DISTI
35f60 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73 20 70  NCT marking is p
35f70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72  ointless.  Ignor
35f80 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70  e it. */.      p
35f90 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
35fa0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
35fb0 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65  T_UNIQUE;.    }e
35fc0 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72 42 79  lse if( pOrderBy
35fd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
35fe0 54 72 79 20 74 6f 20 4f 52 44 45 52 20 42 59 20  Try to ORDER BY 
35ff0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  the result set t
36000 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e 63 74 20  o make distinct 
36010 70 72 6f 63 65 73 73 69 6e 67 20 65 61 73 69 65  processing easie
36020 72 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66  r */.      pWInf
36030 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d  o->wctrlFlags |=
36040 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
36050 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  Y;.      pWInfo-
36060 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 52 65 73  >pOrderBy = pRes
36070 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20  ultSet;.    }.  
36080 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  }..  /* Construc
36090 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  t the WhereLoop 
360a0 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48 45  objects */.  WHE
360b0 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 28  RETRACE(0xffff,(
360c0 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53  "*** Optimizer S
360d0 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  tart ***\n"));. 
360e0 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20   /* Display all 
360f0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
36100 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 23 69 66  RE clause */.#if
36110 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52   defined(WHERETR
36120 41 43 45 5f 45 4e 41 42 4c 45 44 29 20 26 26 20  ACE_ENABLED) && 
36130 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
36140 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
36150 49 4e 29 0a 20 20 69 66 28 20 73 71 6c 69 74 65  IN).  if( sqlite
36160 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
36170 31 30 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  100 ){.    int i
36180 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
36190 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
361a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
361b0 6e 42 65 67 69 6e 28 76 29 3b 0a 20 20 20 20 66  nBegin(v);.    f
361c0 6f 72 28 69 3d 30 3b 20 69 3c 73 57 4c 42 2e 70  or(i=0; i<sWLB.p
361d0 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b  WC->nTerm; i++){
361e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
361f0 70 6c 61 69 6e 50 72 69 6e 74 66 28 76 2c 20 22  plainPrintf(v, "
36200 23 25 2d 32 64 20 22 2c 20 69 29 3b 0a 20 20 20  #%-2d ", i);.   
36210 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
36220 6e 50 75 73 68 28 76 29 3b 0a 20 20 20 20 20 20  nPush(v);.      
36230 77 68 65 72 65 45 78 70 6c 61 69 6e 54 65 72 6d  whereExplainTerm
36240 28 76 2c 20 26 73 57 4c 42 2e 70 57 43 2d 3e 61  (v, &sWLB.pWC->a
36250 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  [i]);.      sqli
36260 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 76 29  te3ExplainPop(v)
36270 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
36280 78 70 6c 61 69 6e 4e 4c 28 76 29 3b 0a 20 20 20  xplainNL(v);.   
36290 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
362a0 70 6c 61 69 6e 46 69 6e 69 73 68 28 76 29 3b 0a  plainFinish(v);.
362b0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
362c0 50 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  Printf("%s", sql
362d0 69 74 65 33 56 64 62 65 45 78 70 6c 61 6e 61 74  ite3VdbeExplanat
362e0 69 6f 6e 28 76 29 29 3b 0a 20 20 7d 0a 23 65 6e  ion(v));.  }.#en
362f0 64 69 66 0a 20 20 69 66 28 20 6e 54 61 62 4c 69  dif.  if( nTabLi
36300 73 74 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68  st!=1 || whereSh
36310 6f 72 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30  ortCut(&sWLB)==0
36320 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65   ){.    rc = whe
36330 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57  reLoopAddAll(&sW
36340 4c 42 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  LB);.    if( rc 
36350 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
36360 6e 45 72 72 6f 72 3b 0a 20 20 0a 20 20 20 20 2f  nError;.  .    /
36370 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66  * Display all of
36380 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
36390 62 6a 65 63 74 73 20 69 66 20 77 68 65 72 65 74  bjects if wheret
363a0 72 61 63 65 20 69 73 20 65 6e 61 62 6c 65 64 20  race is enabled 
363b0 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  */.#ifdef WHERET
363c0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
363d0 21 3d 30 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  !=0 */.    if( s
363e0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
363f0 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c   ){.      WhereL
36400 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e  oop *p;.      in
36410 74 20 69 3b 0a 20 20 20 20 20 20 73 74 61 74 69  t i;.      stati
36420 63 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20  c char zLabel[] 
36430 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63  = "0123456789abc
36440 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
36450 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20  tuvwyxz".       
36460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36480 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
36490 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20  PQRSTUVWYXZ";.  
364a0 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f      for(p=pWInfo
364b0 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70  ->pLoops, i=0; p
364c0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ; p=p->pNextLoop
364d0 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , i++){.        
364e0 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b  p->cId = zLabel[
364f0 69 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29  i%sizeof(zLabel)
36500 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  ];.        where
36510 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73 57 4c  LoopPrint(p, sWL
36520 42 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a  B.pWC);.      }.
36530 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a      }.#endif.  .
36540 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c      wherePathSol
36550 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a  ver(pWInfo, 0);.
36560 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
36570 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
36580 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
36590 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
365a0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
365b0 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c      wherePathSol
365c0 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e  ver(pWInfo, pWIn
365d0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a  fo->nRowOut+1);.
365e0 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
365f0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
36600 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
36610 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  or;.    }.  }.  
36620 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
36630 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e  erBy==0 && (db->
36640 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
36650 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20  everseOrder)!=0 
36660 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ){.     pWInfo->
36670 72 65 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61  revMask = (Bitma
36680 73 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69  sk)(-1);.  }.  i
36690 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
366a0 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c  || NEVER(db->mal
366b0 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20  locFailed) ){.  
366c0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
366d0 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64  nError;.  }.#ifd
366e0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
366f0 41 42 4c 45 44 20 2f 2a 20 21 3d 30 20 2a 2f 0a  ABLED /* !=0 */.
36700 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
36710 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 69  reTrace ){.    i
36720 6e 74 20 69 69 3b 0a 20 20 20 20 73 71 6c 69 74  nt ii;.    sqlit
36730 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d  e3DebugPrintf("-
36740 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f  --- Solution nRo
36750 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e  w=%d", pWInfo->n
36760 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20 69 66 28  RowOut);.    if(
36770 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e   pWInfo->nOBSat>
36780 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
36790 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
367a0 4f 52 44 45 52 42 59 3d 25 64 2c 30 78 25 6c 6c  ORDERBY=%d,0x%ll
367b0 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  x", pWInfo->nOBS
367c0 61 74 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d  at, pWInfo->revM
367d0 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ask);.    }.    
367e0 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e  switch( pWInfo->
367f0 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  eDistinct ){.   
36800 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
36810 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b  STINCT_UNIQUE: {
36820 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
36830 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44  DebugPrintf("  D
36840 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29  ISTINCT=unique")
36850 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
36860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
36870 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
36880 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  CT_ORDERED: {.  
36890 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
368a0 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
368b0 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a  INCT=ordered");.
368c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
368d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
368e0 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
368f0 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  _UNORDERED: {.  
36900 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
36910 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
36920 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29  INCT=unordered")
36930 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
36940 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
36950 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
36960 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
36970 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57   for(ii=0; ii<pW
36980 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69  Info->nLevel; ii
36990 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
369a0 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f  LoopPrint(pWInfo
369b0 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20  ->a[ii].pWLoop, 
369c0 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 7d  sWLB.pWC);.    }
369d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  .  }.#endif.  /*
369e0 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74   Attempt to omit
369f0 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65   tables from the
36a00 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f   join that do no
36a10 74 20 65 66 66 65 63 74 20 74 68 65 20 72 65 73  t effect the res
36a20 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70 57 49  ult */.  if( pWI
36a30 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20  nfo->nLevel>=2. 
36a40 20 20 26 26 20 70 52 65 73 75 6c 74 53 65 74 21    && pResultSet!
36a50 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
36a60 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
36a70 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70   SQLITE_OmitNoop
36a80 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42  Join).  ){.    B
36a90 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d  itmask tabUsed =
36aa0 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
36ab0 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
36ac0 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69  esultSet);.    i
36ad0 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  f( sWLB.pOrderBy
36ae0 20 29 20 74 61 62 55 73 65 64 20 7c 3d 20 65 78   ) tabUsed |= ex
36af0 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
36b00 28 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e  (pMaskSet, sWLB.
36b10 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 77  pOrderBy);.    w
36b20 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  hile( pWInfo->nL
36b30 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20  evel>=2 ){.     
36b40 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
36b50 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20  m, *pEnd;.      
36b60 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  pLoop = pWInfo->
36b70 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  a[pWInfo->nLevel
36b80 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  -1].pWLoop;.    
36b90 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70    if( (pWInfo->p
36ba0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
36bb0 2d 3e 69 54 61 62 5d 2e 6a 6f 69 6e 74 79 70 65  ->iTab].jointype
36bc0 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29   & JT_LEFT)==0 )
36bd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
36be0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
36bf0 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
36c00 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  NCT)==0.       &
36c10 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
36c20 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
36c30 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )==0.      ){.  
36c40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
36c50 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
36c60 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d  tabUsed & pLoop-
36c70 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20  >maskSelf)!=0 ) 
36c80 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e  break;.      pEn
36c90 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20  d = sWLB.pWC->a 
36ca0 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72  + sWLB.pWC->nTer
36cb0 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65  m;.      for(pTe
36cc0 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20  rm=sWLB.pWC->a; 
36cd0 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72  pTerm<pEnd; pTer
36ce0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
36cf0 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
36d00 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  All & pLoop->mas
36d10 6b 53 65 6c 66 29 21 3d 30 0a 20 20 20 20 20 20  kSelf)!=0.      
36d20 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
36d30 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
36d40 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
36d50 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
36d60 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
36d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
36d80 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c        if( pTerm<
36d90 70 45 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  pEnd ) break;.  
36da0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
36db0 78 66 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70  xffff, ("-> drop
36dc0 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65   loop %c not use
36dd0 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64  d\n", pLoop->cId
36de0 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ));.      pWInfo
36df0 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20  ->nLevel--;.    
36e00 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20    nTabList--;.  
36e10 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54    }.  }.  WHERET
36e20 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a  RACE(0xffff,("**
36e30 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69  * Optimizer Fini
36e40 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  shed ***\n"));. 
36e50 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
36e60 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70  >nQueryLoop += p
36e70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a  WInfo->nRowOut;.
36e80 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c  .  /* If the cal
36e90 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45  ler is an UPDATE
36ea0 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
36eb0 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71  ment that is req
36ec0 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  uesting.  ** to 
36ed0 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61  use a one-pass a
36ee0 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d  lgorithm, determ
36ef0 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61  ine if this is a
36f00 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a  ppropriate..  **
36f10 20 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c   The one-pass al
36f20 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72  gorithm only wor
36f30 6b 73 20 69 66 20 74 68 65 20 57 48 45 52 45 20  ks if the WHERE 
36f40 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
36f50 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65  s.  ** the state
36f60 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61  ment to update a
36f70 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a   single row..  *
36f80 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74  /.  assert( (wct
36f90 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
36fa0 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
36fb0 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e  ==0 || pWInfo->n
36fc0 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66  Level==1 );.  if
36fd0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
36fe0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
36ff0 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20 26 26  SIRED)!=0 .   &&
37000 20 28 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70   (pWInfo->a[0].p
37010 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
37020 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d   WHERE_ONEROW)!=
37030 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  0 ){.    pWInfo-
37040 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a  >okOnePass = 1;.
37050 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64      if( HasRowid
37060 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e  (pTabList->a[0].
37070 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 70  pTab) ){.      p
37080 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
37090 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e  op->wsFlags &= ~
370a0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
370b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
370c0 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20  Open all tables 
370d0 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20  in the pTabList 
370e0 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20  and any indices 
370f0 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a  selected for.  *
37100 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73  * searching thos
37110 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
37120 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
37130 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
37140 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
37150 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69  fo->a; ii<nTabLi
37160 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c  st; ii++, pLevel
37170 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
37180 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62  pTab;     /* Tab
37190 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
371a0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
371b0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
371c0 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
371d0 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a  ng table/index *
371e0 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  /.    struct Src
371f0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
37200 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74  tem;..    pTabIt
37210 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
37220 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
37230 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61  ;.    pTab = pTa
37240 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
37250 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
37260 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
37270 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
37280 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
37290 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
372a0 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
372b0 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
372c0 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  al)!=0 || pTab->
372d0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
372e0 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
372f0 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e  /.    }else.#ifn
37300 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
37310 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
37320 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
37330 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
37340 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
37350 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
37360 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73  r *pVTab = (cons
37370 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
37380 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
37390 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab);.      int i
373a0 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
373b0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73  iCursor;.      s
373c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
373d0 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43  (v, OP_VOpen, iC
373e0 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c  ur, 0, 0, pVTab,
373f0 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d   P4_VTAB);.    }
37400 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
37410 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
37420 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20    /* noop */.   
37430 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
37440 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
37450 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
37460 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
37470 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
37480 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f  gs & WHERE_OMIT_
37490 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29  OPEN_CLOSE)==0 )
374a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  {.      int op =
374b0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20   OP_OpenRead;.  
374c0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
374d0 6f 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20 20  okOnePass ){.   
374e0 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65       op = OP_Ope
374f0 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20  nWrite;.        
37500 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
37510 50 61 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74  Pass[0] = pTabIt
37520 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
37530 20 20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69     };.      sqli
37540 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
37550 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  rse, pTabItem->i
37560 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61  Cursor, iDb, pTa
37570 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73  b, op);.      as
37580 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e  sert( pTabItem->
37590 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d  iCursor==pLevel-
375a0 3e 69 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20  >iTabCur );.    
375b0 20 20 74 65 73 74 63 61 73 65 28 20 21 70 57 49    testcase( !pWI
375c0 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
375d0 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  & pTab->nCol==BM
375e0 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
375f0 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e  tcase( !pWInfo->
37600 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61  okOnePass && pTa
37610 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  b->nCol==BMS );.
37620 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66        if( !pWInf
37630 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
37640 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26  pTab->nCol<BMS &
37650 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  & HasRowid(pTab)
37660 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d   ){.        Bitm
37670 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d  ask b = pTabItem
37680 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20  ->colUsed;.     
37690 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20     int n = 0;.  
376a0 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62        for(; b; b
376b0 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  =b>>1, n++){}.  
376c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
376d0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73 71 6c  eChangeP4(v, sql
376e0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
376f0 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20 20 20  ddr(v)-1, .     
37700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37710 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e         SQLITE_IN
37720 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f  T_TO_PTR(n), P4_
37730 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20  INT32);.        
37740 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d  assert( n<=pTab-
37750 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d  >nCol );.      }
37760 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
37770 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
37780 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
37790 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
377a0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
377b0 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70   }.    if( pLoop
377c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
377d0 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  E_INDEXED ){.   
377e0 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20     Index *pIx = 
377f0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
37800 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74  Index;.      int
37810 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20   iIndexCur;.    
37820 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70    int op = OP_Op
37830 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a  enRead;.      /*
37840 20 69 49 64 78 43 75 72 20 69 73 20 61 6c 77 61   iIdxCur is alwa
37850 79 73 20 73 65 74 20 69 66 20 74 6f 20 61 20 70  ys set if to a p
37860 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
37870 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73 73   ONEPASS is poss
37880 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ible */.      as
37890 73 65 72 74 28 20 69 49 64 78 43 75 72 21 3d 30  sert( iIdxCur!=0
378a0 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   || (pWInfo->wct
378b0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
378c0 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
378d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
378e0 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
378f0 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79   && IsPrimaryKey
37900 49 6e 64 65 78 28 70 49 78 29 0a 20 20 20 20 20  Index(pIx).     
37910 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73    && (wctrlFlags
37920 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
37930 45 5f 4f 4e 4c 59 29 21 3d 30 0a 20 20 20 20 20  E_ONLY)!=0.     
37940 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
37950 68 69 73 20 69 73 20 6f 6e 65 20 74 65 72 6d 20  his is one term 
37960 6f 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a  of an OR-optimiz
37970 61 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20  ation using the 
37980 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 61  PRIMARY KEY of a
37990 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 49 54 48  .        ** WITH
379a0 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
379b0 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20    No need for a 
379c0 73 65 70 61 72 61 74 65 20 69 6e 64 65 78 20 2a  separate index *
379d0 2f 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  /.        iIndex
379e0 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54  Cur = pLevel->iT
379f0 61 62 43 75 72 3b 0a 20 20 20 20 20 20 20 20 6f  abCur;.        o
37a00 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
37a10 73 65 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6f  se if( pWInfo->o
37a20 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20 20 20  kOnePass ){.    
37a30 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20      Index *pJ = 
37a40 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
37a50 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  pIndex;.        
37a60 69 49 6e 64 65 78 43 75 72 20 3d 20 69 49 64 78  iIndexCur = iIdx
37a70 43 75 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Cur;.        ass
37a80 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73 20  ert( wctrlFlags 
37a90 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
37aa0 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20 20 20  DESIRED );.     
37ab0 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
37ac0 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49 78 20  (pJ) && pJ!=pIx 
37ad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 49 6e  ){.          iIn
37ae0 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20  dexCur++;.      
37af0 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65      pJ = pJ->pNe
37b00 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  xt;.        }.  
37b10 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70        op = OP_Op
37b20 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20  enWrite;.       
37b30 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
37b40 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65  ePass[1] = iInde
37b50 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xCur;.      }els
37b60 65 20 69 66 28 20 69 49 64 78 43 75 72 20 26 26  e if( iIdxCur &&
37b70 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
37b80 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
37b90 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)!=0 ){.      
37ba0 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 49    iIndexCur = iI
37bb0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c  dxCur;.      }el
37bc0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64  se{.        iInd
37bd0 65 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  exCur = pParse->
37be0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  nTab++;.      }.
37bf0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49        pLevel->iI
37c00 64 78 43 75 72 20 3d 20 69 49 6e 64 65 78 43 75  dxCur = iIndexCu
37c10 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
37c20 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70   pIx->pSchema==p
37c30 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
37c40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 49        assert( iI
37c50 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  ndexCur>=0 );.  
37c60 20 20 20 20 69 66 28 20 6f 70 20 29 7b 0a 20 20      if( op ){.  
37c70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37c80 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69  eAddOp3(v, op, i
37c90 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74  IndexCur, pIx->t
37ca0 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  num, iDb);.     
37cb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
37cc0 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
37cd0 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 20  e, pIx);.       
37ce0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
37cf0 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d   "%s", pIx->zNam
37d00 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e));.      }.   
37d10 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d   }.    if( iDb>=
37d20 30 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56  0 ) sqlite3CodeV
37d30 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
37d40 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f  se, iDb);.    no
37d50 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61  tReady &= ~getMa
37d60 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
37d70 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e  kSet, pTabItem->
37d80 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20  iCursor);.  }.  
37d90 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73  pWInfo->iTop = s
37da0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
37db0 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
37dc0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
37dd0 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
37de0 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47  inError;..  /* G
37df0 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
37e00 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63   to do the searc
37e10 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69  h.  Each iterati
37e20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20  on of the for.  
37e30 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65  ** loop below ge
37e40 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72  nerates code for
37e50 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64   a single nested
37e60 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a   loop of the VM.
37e70 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20    ** program..  
37e80 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  */.  notReady = 
37e90 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66  ~(Bitmask)0;.  f
37ea0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62  or(ii=0; ii<nTab
37eb0 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  List; ii++){.   
37ec0 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
37ed0 6f 2d 3e 61 5b 69 69 5d 3b 0a 23 69 66 6e 64 65  o->a[ii];.#ifnde
37ee0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
37ef0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
37f00 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
37f10 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
37f20 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
37f30 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  X)!=0 ){.      c
37f40 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
37f50 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26  cIndex(pParse, &
37f60 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20  pWInfo->sWC,.   
37f70 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54               &pT
37f80 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
37f90 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61  ->iFrom], notRea
37fa0 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20  dy, pLevel);.   
37fb0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
37fc0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
37fd0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
37fe0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
37ff0 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
38000 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
38010 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c  , pLevel, ii, pL
38020 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74  evel->iFrom, wct
38030 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 70 4c  rlFlags);.    pL
38040 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 20 3d  evel->addrBody =
38050 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
38060 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
38070 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64 65 4f  notReady = codeO
38080 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e  neLoopStart(pWIn
38090 66 6f 2c 20 69 69 2c 20