/ Hex Artifact Content
Login

Artifact 2cd9e0af718d736459ae9d3b0f4532b4a80640d0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nOBSat;.}../*.*
05a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
05b0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
05c0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
05d0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
05e0: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
05f0: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
0600: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
0610: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
0620: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
0630: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
0640: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
0650: 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43  sert( pWInfo->iC
0660: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
0670: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0680: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
0690: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44  ** Return the VD
06a0: 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61  BE address or la
06b0: 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  bel to jump to i
06c0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b  n order to break
06d0: 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45  .** out of a WHE
06e0: 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  RE loop..*/.int 
06f0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
0700: 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  kLabel(WhereInfo
0710: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0720: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  urn pWInfo->iBre
0730: 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ak;.}../*.** Ret
0740: 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55  urn TRUE if an U
0750: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0760: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70  statement can op
0770: 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f  erate directly o
0780: 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20  n.** the rowids 
0790: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57 48  returned by a WH
07a0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74  ERE clause.  Ret
07b0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69  urn FALSE if doi
07c0: 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20  ng an.** UPDATE 
07d0: 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20  or DELETE might 
07e0: 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e  change subsequen
07f0: 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72  t WHERE clause r
0800: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  esults..**.** If
0810: 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
0820: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
0830: 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74 69  d (if this routi
0840: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 29  ne returns true)
0850: 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  .** then also wr
0860: 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73 20  ite the indices 
0870: 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20  of open cursors 
0880: 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a  used by ONEPASS.
0890: 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d  ** into aiCur[0]
08a0: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20   and aiCur[1].  
08b0: 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68  iaCur[0] gets th
08c0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
08d0: 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e  data.** table an
08e0: 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20  d iaCur[1] gets 
08f0: 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  the cursor used 
0900: 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  by an auxiliary 
0910: 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72  index..** Either
0920: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31   value may be -1
0930: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
0940: 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  t cursor is not 
0950: 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72  used..** Any cur
0960: 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77 69  sors returned wi
0970: 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ll have been ope
0980: 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ned for writing.
0990: 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20  .**.** aiCur[0] 
09a0: 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74  and aiCur[1] bot
09b0: 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65 20  h get -1 if the 
09c0: 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67  where-clause log
09d0: 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20  ic is.** unable 
09e0: 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41  to use the ONEPA
09f0: 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  SS optimization.
0a00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
0a10: 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68  hereOkOnePass(Wh
0a20: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
0a30: 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20   int *aiCur){.  
0a40: 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57  memcpy(aiCur, pW
0a50: 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
0a60: 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  ss, sizeof(int)*
0a70: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  2);.  return pWI
0a80: 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a  nfo->okOnePass;.
0a90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0aa0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0ab0: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0ad0: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0ae0: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0af0: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0b00: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0b10: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0b20: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0b30: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0b40: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0b50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0b60: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0b70: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0b80: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0b90: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0ba0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0bb0: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0bc0: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0bd0: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0be0: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0bf0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0c00: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0c10: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0c20: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0c30: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0c40: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0c50: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0c60: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0c70: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0c80: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0c90: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0ca0: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0cb0: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0cc0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0cd0: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0ce0: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0cf0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0d00: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0d20: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0d30: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0d40: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0d50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0d60: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0d70: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0d80: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
0d90: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
0da0: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
0db0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
0dc0: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
0dd0: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
0de0: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
0df0: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
0e00: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
0e10: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
0e20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
0e30: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
0e40: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
0e50: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
0e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0e70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0e80: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
0e90: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
0ea0: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
0eb0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
0ec0: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
0ed0: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
0ee0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
0ef0: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
0f00: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
0f10: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
0f20: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
0f30: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
0f40: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
0f50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
0f60: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f70: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
0f80: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
0f90: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
0fa0: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
0fb0: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
0fc0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
0fd0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
0fe0: 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57  a preallocated W
0ff0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
1000: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
1010: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
1020: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61  Init(.  WhereCla
1030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
1040: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61   /* The WhereCla
1050: 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  use to be initia
1060: 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lized */.  Where
1070: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20  Info *pWInfo    
1080: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1090: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
10a0: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d  ext */.){.  pWC-
10b0: 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  >pWInfo = pWInfo
10c0: 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20  ;.  pWC->pOuter 
10d0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  = 0;.  pWC->nTer
10e0: 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53  m = 0;.  pWC->nS
10f0: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
1100: 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20  pWC->aStatic);. 
1110: 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61   pWC->a = pWC->a
1120: 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Static;.}../* Fo
1130: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
1140: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1150: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
1160: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
1170: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
1180: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
1190: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
11a0: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
11b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11c0: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
11d0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
11e0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
11f0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
1200: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
1210: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1220: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
1230: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
1240: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
1250: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
1260: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
1270: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
1280: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
1290: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
12a0: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
12b0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
12c0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
12d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
12e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
12f0: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
1300: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
1310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
1330: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
1340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1350: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
1360: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1370: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1380: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1390: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
13a0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
13b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
13c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13d0: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
13e0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
13f0: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
1400: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
1410: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
1420: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
1430: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
1440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1450: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
1460: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
1470: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
1480: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
1490: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
14a0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
14b0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
14c0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
14d0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
14e0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
14f0: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
1500: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
1510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1520: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
1530: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
1540: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1550: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
1560: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
1570: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
1580: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
1590: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
15a0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
15b0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
15c0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
15d0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
15e0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
15f0: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
1600: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
1610: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
1620: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1630: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
1640: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
1650: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
1660: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
1670: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
1680: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1690: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
16a0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
16b0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
16c0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
16d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
16e0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
16f0: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
1700: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
1710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1720: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
1730: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1740: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
1750: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
1760: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
1770: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
1780: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
1790: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
17a0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
17b0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
17c0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
17d0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
17e0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
17f0: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
1800: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
1810: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
1820: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
1830: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1840: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
1850: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
1860: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
1870: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
1880: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
1890: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
18a0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
18b0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
18c0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
18d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
18e0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
18f0: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
1900: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
1910: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
1920: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
1930: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
1940: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
1950: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
1960: 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29   *p, u8 wtFlags)
1970: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
1980: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
1990: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46  .  testcase( wtF
19a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
19b0: 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57 43  UAL );.  if( pWC
19c0: 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53  ->nTerm>=pWC->nS
19d0: 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65  lot ){.    Where
19e0: 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43  Term *pOld = pWC
19f0: 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ->a;.    sqlite3
1a00: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e   *db = pWC->pWIn
1a10: 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
1a20: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c      pWC->a = sql
1a30: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1a40: 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e  db, sizeof(pWC->
1a50: 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74  a[0])*pWC->nSlot
1a60: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57  *2 );.    if( pW
1a70: 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  C->a==0 ){.     
1a80: 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54   if( wtFlags & T
1a90: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
1aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ab0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  prDelete(db, p);
1ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ad0: 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20  WC->a = pOld;.  
1ae0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1af0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1b00: 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a  WC->a, pOld, siz
1b10: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
1b20: 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  WC->nTerm);.    
1b30: 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61  if( pOld!=pWC->a
1b40: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
1b50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1b60: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  , pOld);.    }. 
1b70: 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20     pWC->nSlot = 
1b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1b90: 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f  ize(db, pWC->a)/
1ba0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
1bb0: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
1bc0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
1bd0: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
1be0: 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61 73  if( p && ExprHas
1bf0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 55  Property(p, EP_U
1c00: 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20  nlikely) ){.    
1c10: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c20: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1c30: 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 39 39  (p->iTable) - 99
1c40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1c50: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 20  Term->truthProb 
1c60: 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  = 1;.  }.  pTerm
1c70: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
1c80: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1c90: 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  (p);.  pTerm->wt
1ca0: 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b  Flags = wtFlags;
1cb0: 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20  .  pTerm->pWC = 
1cc0: 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50  pWC;.  pTerm->iP
1cd0: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65  arent = -1;.  re
1ce0: 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a  turn idx;.}../*.
1cf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d00: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
1d10: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
1d20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
1d30: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
1d40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
1d50: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e  arated by the AN
1d60: 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f  D operator or so
1d70: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72  me other.** oper
1d80: 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  ator specified i
1d90: 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  n the op paramet
1da0: 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  er.  The WhereCl
1db0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
1dc0: 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  * is filled with
1dd0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62   pointers to sub
1de0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
1df0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
1e00: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
1e10: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
1e20: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
1e30: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
1e40: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
1e50: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
1e60: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
1e70: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
1e80: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
1e90: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
1ea0: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ec0: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
1ed0: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
1ee0: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
1ef0: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
1f00: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
1f10: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
1f20: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
1f30: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
1f40: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
1f50: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
1f60: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
1f70: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
1f80: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
1f90: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
1fa0: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
1fb0: 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74  array.  The slot
1fc0: 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61  [] array grows a
1fd0: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74  s needed to cont
1fe0: 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73  ain.** all terms
1ff0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2000: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
2010: 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28  void whereSplit(
2020: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2030: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75  , Expr *pExpr, u
2040: 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70  8 op){.  pWC->op
2050: 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 78   = op;.  if( pEx
2060: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
2070: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2080: 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65  =op ){.    where
2090: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
20a0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  , pExpr, 0);.  }
20b0: 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53  else{.    whereS
20c0: 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d  plit(pWC, pExpr-
20d0: 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20  >pLeft, op);.   
20e0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
20f0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
2100: 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  op);.  }.}../*.*
2110: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
2120: 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65  hereMaskSet obje
2130: 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e  ct.*/.#define in
2140: 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28 50  itMaskSet(P)  (P
2150: 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52 65  )->n=0../*.** Re
2160: 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  turn the bitmask
2170: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
2180: 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52  ursor number.  R
2190: 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43  eturn 0 if.** iC
21a0: 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
21b0: 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  the set..*/.stat
21c0: 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61  ic Bitmask getMa
21d0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
21e0: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
21f0: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69  Cursor){.  int i
2200: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73  ;.  assert( pMas
2210: 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69  kSet->n<=(int)si
2220: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20  zeof(Bitmask)*8 
2230: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2240: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b  pMaskSet->n; i++
2250: 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b  ){.    if( pMask
2260: 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72  Set->ix[i]==iCur
2270: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sor ){.      ret
2280: 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a  urn MASKBIT(i);.
2290: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
22b0: 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b  reate a new mask
22c0: 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72   for cursor iCur
22d0: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  sor..**.** There
22e0: 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70   is one cursor p
22f0: 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  er table in the 
2300: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
2310: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74  e number of.** t
2320: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2330: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
2340: 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61  ted by a test ea
2350: 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71  rly in the.** sq
2360: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2370: 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77  ) routine.  So w
2380: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
2390: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a  pMaskSet->ix[].*
23a0: 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76  * array will nev
23b0: 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a  er overflow..*/.
23c0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
23d0: 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  teMask(WhereMask
23e0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
23f0: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61  nt iCursor){.  a
2400: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
2410: 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70  >n < ArraySize(p
2420: 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a  MaskSet->ix) );.
2430: 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70    pMaskSet->ix[p
2440: 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20  MaskSet->n++] = 
2450: 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCursor;.}../*.*
2460: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
2470: 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76 65   walk (recursive
2480: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
2490: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
24a0: 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b  ate.** a bitmask
24b0: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63   indicating whic
24c0: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65  h tables are use
24d0: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  d in that expres
24e0: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2f  sion.** tree..*/
24f0: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
2500: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2510: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
2520: 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
2530: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
2540: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
2550: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c  e(WhereMaskSet*,
2560: 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69   Select*);.stati
2570: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61  c Bitmask exprTa
2580: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2590: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
25a0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
25b0: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
25c0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
25d0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  rn 0;.  if( p->o
25e0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
25f0: 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61      mask = getMa
2600: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  sk(pMaskSet, p->
2610: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74  iTable);.    ret
2620: 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20  urn mask;.  }.  
2630: 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65  mask = exprTable
2640: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2650: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61  p->pRight);.  ma
2660: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
2670: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2680: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
2690: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26a0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
26b0: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20   ){.    mask |= 
26c0: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
26d0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
26e0: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
26f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20  }else{.    mask 
2700: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
2710: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2720: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
2730: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
2740: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
2750: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2760: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2770: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
2780: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
2790: 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b  int i;.  Bitmask
27a0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
27b0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
27c0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
27d0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
27e0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
27f0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2800: 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  et, pList->a[i].
2810: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2820: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
2830: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
2840: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
2850: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
2860: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53  Set *pMaskSet, S
2870: 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69  elect *pS){.  Bi
2880: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
2890: 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20    while( pS ){. 
28a0: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
28b0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
28c0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
28d0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
28e0: 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74  kSet, pS->pEList
28f0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2900: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2910: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
2920: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d  pGroupBy);.    m
2930: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
2940: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2950: 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79  et, pS->pOrderBy
2960: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2970: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
2980: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65  askSet, pS->pWhe
2990: 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  re);.    mask |=
29a0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
29b0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48  pMaskSet, pS->pH
29c0: 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20  aving);.    if( 
29d0: 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29 20  ALWAYS(pSrc!=0) 
29e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
29f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2a00: 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
2a10: 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20  ){.        mask 
2a20: 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  |= exprSelectTab
2a30: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2a40: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  , pSrc->a[i].pSe
2a50: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d  lect);.        m
2a60: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2a70: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2a80: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b  pSrc->a[i].pOn);
2a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2aa0: 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69     pS = pS->pPri
2ab0: 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
2ac0: 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   mask;.}../*.** 
2ad0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2ae0: 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f  he given operato
2af0: 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  r is one of the 
2b00: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2b10: 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72  s.** allowed for
2b20: 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48   an indexable WH
2b30: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
2b40: 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70    The allowed op
2b50: 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22  erators are.** "
2b60: 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c  =", "<", ">", "<
2b70: 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c 20  =", ">=", "IN", 
2b80: 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a 2f  and "IS NULL".*/
2b90: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
2ba0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
2bb0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
2bc0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
2bd0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2be0: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
2bf0: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
2c00: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
2c10: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
2c20: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2c30: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
2c40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
2c50: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
2c60: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
2c70: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
2c80: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  LL;.}../*.** Com
2c90: 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f  mute a compariso
2ca0: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70  n operator.  Exp
2cb0: 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
2cc0: 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a  form "X op Y".**
2cd0: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
2ce0: 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a  nto "Y op X"..**
2cf0: 0a 2a 2a 20 49 66 20 6c 65 66 74 2f 72 69 67 68  .** If left/righ
2d00: 74 20 70 72 65 63 65 64 65 6e 63 65 20 72 75 6c  t precedence rul
2d10: 65 73 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61  es come into pla
2d20: 79 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69  y when determini
2d30: 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74  ng the.** collat
2d40: 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 74 68  ing sequence, th
2d50: 65 6e 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  en COLLATE opera
2d60: 74 6f 72 73 20 61 72 65 20 61 64 6a 75 73 74 65  tors are adjuste
2d70: 64 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74  d to ensure.** t
2d80: 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  hat the collatin
2d90: 67 20 73 65 71 75 65 6e 63 65 20 64 6f 65 73 20  g sequence does 
2da0: 6e 6f 74 20 63 68 61 6e 67 65 2e 20 20 46 6f 72  not change.  For
2db0: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59 20   example:.** "Y 
2dc0: 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f  collate NOCASE o
2dd0: 70 20 58 22 20 62 65 63 6f 6d 65 73 20 22 58 20  p X" becomes "X 
2de0: 6f 70 20 59 22 20 62 65 63 61 75 73 65 20 61 6e  op Y" because an
2df0: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
2e00: 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c  ence on.** the l
2e10: 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  eft hand side of
2e20: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76   a comparison ov
2e30: 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c  errides any coll
2e40: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a  ation sequence .
2e50: 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ** attached to t
2e60: 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68  he right. For th
2e70: 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68  e same reason th
2e80: 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61  e EP_Collate fla
2e90: 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d  g.** is not comm
2ea0: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
2eb0: 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65  void exprCommute
2ec0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2ed0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2ee0: 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20 28  u16 expRight = (
2ef0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
2f00: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
2f10: 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66  e);.  u16 expLef
2f20: 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66  t = (pExpr->pLef
2f30: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
2f40: 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  llate);.  assert
2f50: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70  ( allowedOp(pExp
2f60: 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d  r->op) && pExpr-
2f70: 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op!=TK_IN );.  
2f80: 69 66 28 20 65 78 70 52 69 67 68 74 3d 3d 65 78  if( expRight==ex
2f90: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a 20  pLeft ){.    /* 
2fa0: 45 69 74 68 65 72 20 58 20 61 6e 64 20 59 20 62  Either X and Y b
2fb0: 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c 41 54 45  oth have COLLATE
2fc0: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 6e 65 69   operator or nei
2fd0: 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20 69  ther do */.    i
2fe0: 66 28 20 65 78 70 52 69 67 68 74 20 29 7b 0a 20  f( expRight ){. 
2ff0: 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 58 20 61       /* Both X a
3000: 6e 64 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54  nd Y have COLLAT
3010: 45 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d 61  E operators.  Ma
3020: 6b 65 20 73 75 72 65 20 58 20 69 73 20 61 6c 77  ke sure X is alw
3030: 61 79 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 65  ays.      ** use
3040: 64 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68  d by clearing th
3050: 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61  e EP_Collate fla
3060: 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20  g from Y. */.   
3070: 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
3080: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43  ->flags &= ~EP_C
3090: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73  ollate;.    }els
30a0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70  e if( sqlite3Exp
30b0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
30c0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
30d0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65  0 ){.      /* Ne
30e0: 69 74 68 65 72 20 58 20 6e 6f 72 20 59 20 68 61  ither X nor Y ha
30f0: 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  ve COLLATE opera
3100: 74 6f 72 73 2c 20 62 75 74 20 58 20 68 61 73 20  tors, but X has 
3110: 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20 20  a non-default.  
3120: 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67      ** collating
3130: 20 73 65 71 75 65 6e 63 65 2e 20 20 53 6f 20 61   sequence.  So a
3140: 64 64 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74  dd the EP_Collat
3150: 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74 6f  e marker on X to
3160: 20 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20   cause.      ** 
3170: 69 74 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  it to be searche
3180: 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20  d first. */.    
3190: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e    pExpr->pLeft->
31a0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c  flags |= EP_Coll
31b0: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ate;.    }.  }. 
31c0: 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70   SWAP(Expr*,pExp
31d0: 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d  r->pRight,pExpr-
31e0: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
31f0: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
3200: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ){.    assert( T
3210: 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
3220: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
3230: 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20  GE==TK_LE+2 );. 
3240: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
3250: 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  >TK_EQ );.    as
3260: 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c  sert( TK_GT<TK_L
3270: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
3280: 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47   pExpr->op>=TK_G
3290: 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d  T && pExpr->op<=
32a0: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78  TK_GE );.    pEx
32b0: 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72  pr->op = ((pExpr
32c0: 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54  ->op-TK_GT)^2)+T
32d0: 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  K_GT;.  }.}../*.
32e0: 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f  ** Translate fro
32f0: 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72  m TK_xx operator
3300: 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73   to WO_xx bitmas
3310: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  k..*/.static u16
3320: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e   operatorMask(in
3330: 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a  t op){.  u16 c;.
3340: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
3350: 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28  dOp(op) );.  if(
3360: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20   op==TK_IN ){.  
3370: 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d    c = WO_IN;.  }
3380: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
3390: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20  ISNULL ){.    c 
33a0: 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d  = WO_ISNULL;.  }
33b0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
33c0: 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b  ( (WO_EQ<<(op-TK
33d0: 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20 29  _EQ)) < 0x7fff )
33e0: 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29 28  ;.    c = (u16)(
33f0: 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51  WO_EQ<<(op-TK_EQ
3400: 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ));.  }.  assert
3410: 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op!=TK_ISNULL 
3420: 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  || c==WO_ISNULL 
3430: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
3440: 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_IN || c==WO_
3450: 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IN );.  assert( 
3460: 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d  op!=TK_EQ || c==
3470: 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72  WO_EQ );.  asser
3480: 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  t( op!=TK_LT || 
3490: 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73  c==WO_LT );.  as
34a0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20  sert( op!=TK_LE 
34b0: 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20  || c==WO_LE );. 
34c0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
34d0: 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29  GT || c==WO_GT )
34e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
34f0: 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47  TK_GE || c==WO_G
3500: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b  E );.  return c;
3510: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
3520: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 57 68  e to the next Wh
3530: 65 72 65 54 65 72 6d 20 74 68 61 74 20 6d 61 74  ereTerm that mat
3540: 63 68 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  ches according t
3550: 6f 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a  o the criteria.*
3560: 2a 20 65 73 74 61 62 6c 69 73 68 65 64 20 77 68  * established wh
3570: 65 6e 20 74 68 65 20 70 53 63 61 6e 20 6f 62 6a  en the pScan obj
3580: 65 63 74 20 77 61 73 20 69 6e 69 74 69 61 6c 69  ect was initiali
3590: 7a 65 64 20 62 79 20 77 68 65 72 65 53 63 61 6e  zed by whereScan
35a0: 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72  Init()..** Retur
35b0: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  n NULL if there 
35c0: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63  are no more matc
35d0: 68 69 6e 67 20 57 68 65 72 65 54 65 72 6d 73 2e  hing WhereTerms.
35e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
35f0: 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e  Term *whereScanN
3600: 65 78 74 28 57 68 65 72 65 53 63 61 6e 20 2a 70  ext(WhereScan *p
3610: 53 63 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75  Scan){.  int iCu
3620: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
3630: 20 54 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 74   The cursor on t
3640: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65  he LHS of the te
3650: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  rm */.  int iCol
3660: 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  umn;         /* 
3670: 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  The column on th
3680: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72  e LHS of the ter
3690: 6d 2e 20 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a  m.  -1 for IPK *
36a0: 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20  /.  Expr *pX;   
36b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
36c0: 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20  xpression being 
36d0: 74 65 73 74 65 64 20 2a 2f 0a 20 20 57 68 65 72  tested */.  Wher
36e0: 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
36f0: 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f   /* Shorthand fo
3700: 72 20 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a  r pScan->pWC */.
3710: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
3720: 72 6d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65  rm;    /* The te
3730: 72 6d 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  rm being tested 
3740: 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53 63  */.  int k = pSc
3750: 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68 65  an->k;    /* Whe
3760: 72 65 20 74 6f 20 73 74 61 72 74 20 73 63 61 6e  re to start scan
3770: 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77 68 69 6c 65  ning */..  while
3780: 28 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c  ( pScan->iEquiv<
3790: 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29  =pScan->nEquiv )
37a0: 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 70 53 63  {.    iCur = pSc
37b0: 61 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e  an->aEquiv[pScan
37c0: 2d 3e 69 45 71 75 69 76 2d 32 5d 3b 0a 20 20 20  ->iEquiv-2];.   
37d0: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 53 63 61 6e   iColumn = pScan
37e0: 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e  ->aEquiv[pScan->
37f0: 69 45 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20 77  iEquiv-1];.    w
3800: 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53 63  hile( (pWC = pSc
3810: 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20  an->pWC)!=0 ){. 
3820: 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70       for(pTerm=p
3830: 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e  WC->a+k; k<pWC->
3840: 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72  nTerm; k++, pTer
3850: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
3860: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
3870: 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20  sor==iCur.      
3880: 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c     && pTerm->u.l
3890: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
38a0: 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  mn.         && (
38b0: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 32  pScan->iEquiv<=2
38c0: 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70   || !ExprHasProp
38d0: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
38e0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
38f0: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
3900: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
3910: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
3920: 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20  _EQUIV)!=0.     
3930: 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e        && pScan->
3940: 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65  nEquiv<ArraySize
3950: 28 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 29 0a  (pScan->aEquiv).
3960: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
3970: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
3980: 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20 3d              pX =
3990: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
39a0: 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70  Collate(pTerm->p
39b0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
39c0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
39d0: 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  t( pX->op==TK_CO
39e0: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
39f0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3a00: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b  Scan->nEquiv; j+
3a10: 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  =2){.           
3a20: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 61 45     if( pScan->aE
3a30: 71 75 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54 61  quiv[j]==pX->iTa
3a40: 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
3a50: 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 61 45 71     && pScan->aEq
3a60: 75 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69 43  uiv[j+1]==pX->iC
3a70: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
3a80: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
3a90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3aa0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
3ac0: 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76  j==pScan->nEquiv
3ad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3ae0: 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b    pScan->aEquiv[
3af0: 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b  j] = pX->iTable;
3b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
3b10: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31  Scan->aEquiv[j+1
3b20: 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3b  ] = pX->iColumn;
3b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
3b40: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d 20  Scan->nEquiv += 
3b50: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  2;.            }
3b60: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3b70: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
3b80: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70  m->eOperator & p
3b90: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30  Scan->opMask)!=0
3ba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3bb0: 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61 66  /* Verify the af
3bc0: 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61  finity and colla
3bd0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61  ting sequence ma
3be0: 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
3bf0: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43     if( pScan->zC
3c00: 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72  ollName && (pTer
3c10: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
3c20: 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  O_ISNULL)==0 ){.
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f                Co
3c40: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72 73              Pars
3c60: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
3c70: 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b  >pWInfo->pParse;
3c80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
3c90: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
3ca0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3cb0: 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
3cc0: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20  xAffinityOk(pX, 
3cd0: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29  pScan->idxaff) )
3ce0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3cf0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
3d00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3d10: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
3d20: 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  (pX->pLeft);.   
3d30: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
3d40: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
3d50: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
3d60: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d90: 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65           pX->pLe
3da0: 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  ft, pX->pRight);
3db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
3dc0: 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43  f( pColl==0 ) pC
3dd0: 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
3de0: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
3df0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
3e00: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
3e10: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61  oll->zName, pSca
3e20: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b  n->zCollName) ){
3e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3e40: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
3e50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3e60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3e70: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
3e80: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
3e90: 45 51 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  EQ)!=0.         
3ea0: 20 20 20 20 26 26 20 28 70 58 20 3d 20 70 54 65      && (pX = pTe
3eb0: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
3ec0: 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  t)->op==TK_COLUM
3ed0: 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  N.             &
3ee0: 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  & pX->iTable==pS
3ef0: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a 20  can->aEquiv[0]. 
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
3f10: 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63 61  X->iColumn==pSca
3f20: 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20 20  n->aEquiv[1].   
3f30: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
3f40: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
3f50: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
3f60: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  }.            pS
3f70: 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20  can->k = k+1;.  
3f80: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
3f90: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
3fa0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
3fb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61      }.      pSca
3fc0: 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  n->pWC = pScan->
3fd0: 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20  pWC->pOuter;.   
3fe0: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a     k = 0;.    }.
3ff0: 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d      pScan->pWC =
4000: 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b   pScan->pOrigWC;
4010: 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20  .    k = 0;.    
4020: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b 3d  pScan->iEquiv +=
4030: 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   2;.  }.  return
4040: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   0;.}../*.** Ini
4050: 74 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20  tialize a WHERE 
4060: 63 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f  clause scanner o
4070: 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61  bject.  Return a
4080: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
4090: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20  ** first match. 
40a0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
40b0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74  there are no mat
40c0: 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ches..**.** The 
40d0: 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20  scanner will be 
40e0: 73 65 61 72 63 68 69 6e 67 20 74 68 65 20 57 48  searching the WH
40f0: 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20  ERE clause pWC. 
4100: 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a   It will look.**
4110: 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68   for terms of th
4120: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
4130: 65 78 70 72 3e 22 20 77 68 65 72 65 20 58 20 69  expr>" where X i
4140: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e  s column iColumn
4150: 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75   of table.** iCu
4160: 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73  r.  The <op> mus
4170: 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  t be one of the 
4180: 6f 70 65 72 61 74 6f 72 73 20 64 65 73 63 72 69  operators descri
4190: 62 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a  bed by opMask..*
41a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72  *.** If the sear
41b0: 63 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20  ch is for X and 
41c0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
41d0: 20 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20   contains terms 
41e0: 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58  of the.** form X
41f0: 3d 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  =Y then this rou
4200: 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20  tine might also 
4210: 72 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20  return terms of 
4220: 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c  the form.** "Y <
4230: 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68  op> <expr>".  Th
4240: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  e number of leve
4250: 6c 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69  ls of transitivi
4260: 74 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a  ty is limited,.*
4270: 2a 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20  * but is enough 
4280: 74 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63  to handle most c
4290: 6f 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e  ommonly occurrin
42a0: 67 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  g SQL statements
42b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20  ..**.** If X is 
42c0: 6e 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52 20  not the INTEGER 
42d0: 50 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e  PRIMARY KEY then
42e0: 20 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61   X must be compa
42f0: 74 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e  tible with.** in
4300: 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61  dex pIdx..*/.sta
4310: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77  tic WhereTerm *w
4320: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20  hereScanInit(.  
4330: 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e  WhereScan *pScan
4340: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  ,       /* The W
4350: 68 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20  hereScan object 
4360: 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65  being initialize
4370: 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  d */.  WhereClau
4380: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f  se *pWC,       /
4390: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
43a0: 73 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  se to be scanned
43b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
43d0: 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
43e0: 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  for */.  int iCo
43f0: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
4400: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63   /* Column to sc
4410: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20  an for */.  u32 
4420: 6f 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20  opMask,         
4430: 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28      /* Operator(
4440: 73 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  s) to scan for *
4450: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
4460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
4470: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
4480: 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65  e with this inde
4490: 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 3b  x */.){.  int j;
44a0: 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53  ..  /* memset(pS
44b0: 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  can, 0, sizeof(*
44c0: 70 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53  pScan)); */.  pS
44d0: 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70  can->pOrigWC = p
44e0: 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43  WC;.  pScan->pWC
44f0: 20 3d 20 70 57 43 3b 0a 20 20 69 66 28 20 70 49   = pWC;.  if( pI
4500: 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30  dx && iColumn>=0
4510: 20 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69   ){.    pScan->i
4520: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
4530: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
4540: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
4550: 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d    for(j=0; pIdx-
4560: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43  >aiColumn[j]!=iC
4570: 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
4580: 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 70     if( NEVER(j>p
4590: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20  Idx->nColumn) ) 
45a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
45b0: 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c      pScan->zColl
45c0: 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Name = pIdx->azC
45d0: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b  oll[j];.  }else{
45e0: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  .    pScan->idxa
45f0: 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61  ff = 0;.    pSca
4600: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30  n->zCollName = 0
4610: 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f  ;.  }.  pScan->o
4620: 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a  pMask = opMask;.
4630: 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a    pScan->k = 0;.
4640: 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b    pScan->aEquiv[
4650: 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63  0] = iCur;.  pSc
4660: 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 20 3d 20  an->aEquiv[1] = 
4670: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e  iColumn;.  pScan
4680: 2d 3e 6e 45 71 75 69 76 20 3d 20 32 3b 0a 20 20  ->nEquiv = 2;.  
4690: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20  pScan->iEquiv = 
46a0: 32 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72  2;.  return wher
46b0: 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29  eScanNext(pScan)
46c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
46d0: 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20  h for a term in 
46e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
46f0: 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20   that is of the 
4700: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
4710: 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20  pr>".** where X 
4720: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
4730: 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66  o the iColumn of
4740: 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20   table iCur and 
4750: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a  <op> is one of.*
4760: 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72  * the WO_xx oper
4770: 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69  ator codes speci
4780: 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70  fied by the op p
4790: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74  arameter..** Ret
47a0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
47b0: 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75   the term.  Retu
47c0: 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e  rn 0 if not foun
47d0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  d..**.** The ter
47e0: 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74  m returned might
47f0: 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20   by Y=<expr> if 
4800: 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72  there is another
4810: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a   constraint in.*
4820: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
4830: 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  se that specifie
4840: 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79  s that X=Y.  Any
4850: 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74   such constraint
4860: 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65  s will be.** ide
4870: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57  ntified by the W
4880: 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74  O_EQUIV bit in t
4890: 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  he pTerm->eOpera
48a0: 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a  tor field.  The.
48b0: 2a 2a 20 61 45 71 75 69 76 5b 5d 20 61 72 72 61  ** aEquiv[] arra
48c0: 79 20 68 6f 6c 64 73 20 58 20 61 6e 64 20 61 6c  y holds X and al
48d0: 6c 20 69 74 73 20 65 71 75 69 76 61 6c 65 6e 74  l its equivalent
48e0: 73 2c 20 77 69 74 68 20 65 61 63 68 20 53 51 4c  s, with each SQL
48f0: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 61 6b   variable.** tak
4900: 69 6e 67 20 75 70 20 74 77 6f 20 73 6c 6f 74 73  ing up two slots
4910: 20 69 6e 20 61 45 71 75 69 76 5b 5d 2e 20 20 54   in aEquiv[].  T
4920: 68 65 20 66 69 72 73 74 20 73 6c 6f 74 20 69 73  he first slot is
4930: 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 20   for the cursor 
4940: 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20 74 68  number.** and th
4950: 65 20 73 65 63 6f 6e 64 20 69 73 20 66 6f 72 20  e second is for 
4960: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
4970: 72 2e 20 20 54 68 65 72 65 20 61 72 65 20 32 32  r.  There are 22
4980: 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76   slots in aEquiv
4990: 5b 5d 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6d 65  [].** so that me
49a0: 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20  ans we can look 
49b0: 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74 6f  for X plus up to
49c0: 20 31 30 20 6f 74 68 65 72 20 65 71 75 69 76 61   10 other equiva
49d0: 6c 65 6e 74 20 76 61 6c 75 65 73 2e 0a 2a 2a 20  lent values..** 
49e0: 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20 66  Hence a search f
49f0: 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72 6e  or X will return
4a00: 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31 20   <expr> if X=A1 
4a10: 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41 32  and A1=A2 and A2
4a20: 3d 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e 2e 20 61  =A3.** and ... a
4a30: 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41 31  nd A9=A10 and A1
4a40: 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20  0=<expr>..**.** 
4a50: 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c  If there are mul
4a60: 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74  tiple terms in t
4a70: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4a80: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
4a90: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74  op> <expr>".** t
4aa0: 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65 20  hen try for the 
4ab0: 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70 65  one with no depe
4ac0: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70  ndencies on <exp
4ad0: 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f  r> - in other wo
4ae0: 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78  rds where.** <ex
4af0: 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  pr> is a constan
4b00: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  t expression of 
4b10: 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79  some kind.  Only
4b20: 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73 20   return entries 
4b30: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
4b40: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
4b50: 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  Y is a column in
4b60: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
4b70: 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a  f no terms of.**
4b80: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
4b90: 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20  > <const-expr>" 
4ba0: 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20 74  exist.   If no t
4bb0: 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e 73  erms with a cons
4bc0: 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69 73  tant RHS.** exis
4bd0: 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72 6e  t, try to return
4be0: 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f 65   a term that doe
4bf0: 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51 55  s not use WO_EQU
4c00: 49 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  IV..*/.static Wh
4c10: 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72  ereTerm *findTer
4c20: 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m(.  WhereClause
4c30: 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68   *pWC,     /* Th
4c40: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
4c50: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f  o be searched */
4c60: 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
4c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
4c80: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53  or number of LHS
4c90: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
4ca0: 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  n,          /* C
4cb0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
4cc0: 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  LHS */.  Bitmask
4cd0: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
4ce0: 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f  * RHS must not o
4cf0: 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73  verlap with this
4d00: 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f   mask */.  u32 o
4d10: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
4d20: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78   /* Mask of WO_x
4d30: 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62  x values describ
4d40: 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ing operator */.
4d50: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
4d60: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
4d70: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
4d80: 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69  th this index, i
4d90: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
4da0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52  .  WhereTerm *pR
4db0: 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57 68 65  esult = 0;.  Whe
4dc0: 72 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57 68 65  reTerm *p;.  Whe
4dd0: 72 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a 20 20  reScan scan;..  
4de0: 70 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69  p = whereScanIni
4df0: 74 28 26 73 63 61 6e 2c 20 70 57 43 2c 20 69 43  t(&scan, pWC, iC
4e00: 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c  ur, iColumn, op,
4e10: 20 70 49 64 78 29 3b 0a 20 20 77 68 69 6c 65 28   pIdx);.  while(
4e20: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70   p ){.    if( (p
4e30: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
4e40: 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a  notReady)==0 ){.
4e50: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65        if( p->pre
4e60: 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28  reqRight==0 && (
4e70: 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f  p->eOperator&WO_
4e80: 45 51 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  EQ)!=0 ){.      
4e90: 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20    return p;.    
4ea0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 52    }.      if( pR
4eb0: 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73 75  esult==0 ) pResu
4ec0: 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  lt = p;.    }.  
4ed0: 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 4e    p = whereScanN
4ee0: 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d 0a  ext(&scan);.  }.
4ef0: 20 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c 74    return pResult
4f00: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
4f10: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
4f20: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
4f30: 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20 57  lyze(SrcList*, W
4f40: 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74  hereClause*, int
4f50: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65  );../*.** Call e
4f60: 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c  xprAnalyze on al
4f70: 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45  l terms in a WHE
4f80: 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2f 0a  RE clause.  .*/.
4f90: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
4fa0: 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72  AnalyzeAll(.  Sr
4fb0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
4fc0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
4fd0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
4fe0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20  hereClause *pWC 
4ff0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
5000: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
5010: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
5020: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5030: 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20  i=pWC->nTerm-1; 
5040: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
5050: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62  exprAnalyze(pTab
5060: 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20  List, pWC, i);. 
5070: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
5080: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
5090: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  PTIMIZATION./*.*
50a0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
50b0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
50c0: 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45  ession is a LIKE
50d0: 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f   or GLOB operato
50e0: 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  r that.** can be
50f0: 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
5100: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
5110: 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e  traints.  Return
5120: 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a   TRUE if it is.*
5130: 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69  * so and false i
5140: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  f not..**.** In 
5150: 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70  order for the op
5160: 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74  erator to be opt
5170: 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48  imizible, the RH
5180: 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72 69  S must be a stri
5190: 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68  ng.** literal th
51a0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  at does not begi
51b0: 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72  n with a wildcar
51c0: 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  d.  .*/.static i
51d0: 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  nt isLikeOrGlob(
51e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
51f0: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
5200: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
5210: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
5220: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
5230: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
5240: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
5250: 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c  Expr **ppPrefix,
5260: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
5270: 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73  TK_STRING expres
5280: 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72  sion with patter
5290: 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e  n prefix */.  in
52a0: 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20  t *pisComplete, 
52b0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f  /* True if the o
52c0: 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73 20  nly wildcard is 
52d0: 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68  % in the last ch
52e0: 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74  aracter */.  int
52f0: 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f   *pnoCase      /
5300: 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72 63  * True if upperc
5310: 61 73 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ase is equivalen
5320: 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a  t to lowercase *
5330: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
5340: 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20 20  r *z = 0;       
5350: 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52    /* String on R
5360: 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61  HS of LIKE opera
5370: 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  tor */.  Expr *p
5380: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20  Right, *pLeft;  
5390: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e 64      /* Right and
53a0: 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c 49   left size of LI
53b0: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
53c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
53d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
53e0: 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73 20  ist of operands 
53f0: 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72  to the LIKE oper
5400: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b  ator */.  int c;
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72       /* One char
5430: 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a  acter in z[] */.
5440: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5460: 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69  Number of non-wi
5470: 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63 68  ldcard prefix ch
5480: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63 68  aracters */.  ch
5490: 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20 20  ar wc[3];       
54a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 64           /* Wild
54b0: 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20  card characters 
54c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
54d0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
54e0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
54f0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  ection */.  sqli
5500: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20  te3_value *pVal 
5510: 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20  = 0;.  int op;  
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70    /* Opcode of p
5540: 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20  Right */..  if( 
5550: 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75  !sqlite3IsLikeFu
5560: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72  nction(db, pExpr
5570: 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29  , pnoCase, wc) )
5580: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5590: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
55a0: 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a  E_EBCDIC.  if( *
55b0: 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e  pnoCase ) return
55c0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69   0;.#endif.  pLi
55d0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
55e0: 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70  ist;.  pLeft = p
55f0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
5600: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  ;.  if( pLeft->o
5610: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20  p!=TK_COLUMN .  
5620: 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41   || sqlite3ExprA
5630: 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d  ffinity(pLeft)!=
5640: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
5650: 0a 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  .   || IsVirtual
5660: 28 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a 20 20  (pLeft->pTab).  
5670: 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ){.    /* IMP: R
5680: 2d 30 32 30 36 35 2d 34 39 34 36 35 20 54 68 65  -02065-49465 The
5690: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
56a0: 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47  of the LIKE or G
56b0: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75 73  LOB operator mus
56c0: 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
56d0: 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65 78  name of an index
56e0: 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54  ed column with T
56f0: 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f  EXT affinity. */
5700: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5710: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65   }.  assert( pLe
5720: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31  ft->iColumn!=(-1
5730: 29 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  ) ); /* Because 
5740: 49 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41 46  IPK never has AF
5750: 46 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69  F_TEXT */..  pRi
5760: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
5770: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
5780: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
5790: 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e  .  op = pRight->
57a0: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
57b0: 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20  _VARIABLE ){.   
57c0: 20 56 64 62 65 20 2a 70 52 65 70 72 65 70 61 72   Vdbe *pReprepar
57d0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65 70  e = pParse->pRep
57e0: 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e 74 20  repare;.    int 
57f0: 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d 3e 69  iCol = pRight->i
5800: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56 61 6c  Column;.    pVal
5810: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
5820: 74 42 6f 75 6e 64 56 61 6c 75 65 28 70 52 65 70  tBoundValue(pRep
5830: 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51  repare, iCol, SQ
5840: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a  LITE_AFF_NONE);.
5850: 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26 20      if( pVal && 
5860: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
5870: 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45  pe(pVal)==SQLITE
5880: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a  _TEXT ){.      z
5890: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
58a0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56  e3_value_text(pV
58b0: 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  al);.    }.    s
58c0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
58d0: 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64  mask(pParse->pVd
58e0: 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 61  be, iCol);.    a
58f0: 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f  ssert( pRight->o
5900: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c  p==TK_VARIABLE |
5910: 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  | pRight->op==TK
5920: 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 7d  _REGISTER );.  }
5930: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
5940: 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20  STRING ){.    z 
5950: 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  = pRight->u.zTok
5960: 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20  en;.  }.  if( z 
5970: 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a  ){.    cnt = 0;.
5980: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b      while( (c=z[
5990: 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77  cnt])!=0 && c!=w
59a0: 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d  c[0] && c!=wc[1]
59b0: 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a   && c!=wc[2] ){.
59c0: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
59d0: 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d   }.    if( cnt!=
59e0: 30 20 26 26 20 32 35 35 21 3d 28 75 38 29 7a 5b  0 && 255!=(u8)z[
59f0: 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20  cnt-1] ){.      
5a00: 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b 0a 20  Expr *pPrefix;. 
5a10: 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74       *pisComplet
5a20: 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20  e = c==wc[0] && 
5a30: 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20  z[cnt+1]==0;.   
5a40: 20 20 20 70 50 72 65 66 69 78 20 3d 20 73 71 6c     pPrefix = sql
5a50: 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
5a60: 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20  STRING, z);.    
5a70: 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29 20    if( pPrefix ) 
5a80: 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65  pPrefix->u.zToke
5a90: 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20  n[cnt] = 0;.    
5aa0: 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70 50    *ppPrefix = pP
5ab0: 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69 66 28  refix;.      if(
5ac0: 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45   op==TK_VARIABLE
5ad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65   ){.        Vdbe
5ae0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
5af0: 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  dbe;.        sql
5b00: 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
5b10: 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69 43  sk(v, pRight->iC
5b20: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
5b30: 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65  if( *pisComplete
5b40: 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54   && pRight->u.zT
5b50: 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20  oken[1] ){.     
5b60: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
5b70: 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 65  hs of the LIKE e
5b80: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
5b90: 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68 65  ariable, and the
5ba0: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20   current.       
5bb0: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
5bc0: 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61 6e  he variable mean
5bd0: 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  s there is no ne
5be0: 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ed to invoke the
5bf0: 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20 20   LIKE.          
5c00: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  ** function, the
5c10: 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65  n no OP_Variable
5c20: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
5c30: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20  o the program.. 
5c40: 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
5c50: 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d 73   causes problems
5c60: 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
5c70: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
5c80: 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20 20  name().         
5c90: 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b   ** API. To work
5ca0: 20 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64   around them, ad
5cb0: 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72  d a dummy OP_Var
5cc0: 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20  iable here..    
5cd0: 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
5ce0: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
5cf0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
5d00: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
5d10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
5d20: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
5d30: 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20  pRight, r1);.   
5d40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5d50: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71  beChangeP3(v, sq
5d60: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
5d70: 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20  Addr(v)-1, 0);. 
5d80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5d90: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5da0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5db0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5dc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
5dd0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
5de0: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
5df0: 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74  ree(pVal);.  ret
5e00: 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65  urn (z!=0);.}.#e
5e10: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
5e20: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
5e30: 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64  ATION */...#ifnd
5e40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
5e50: 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
5e60: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
5e70: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
5e80: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
5e90: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
5ea0: 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48      column MATCH
5eb0: 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69   expr.**.** If i
5ec0: 74 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e  t is then return
5ed0: 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20   TRUE.  If not, 
5ee0: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
5ef0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61  .static int isMa
5f00: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45  tchOfColumn(.  E
5f10: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
5f20: 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70  /* Test this exp
5f30: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
5f40: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
5f50: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ..  if( pExpr->o
5f60: 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p!=TK_FUNCTION )
5f70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5f80: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
5f90: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
5fa0: 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22  u.zToken,"match"
5fb0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
5fc0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
5fd0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
5fe0: 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  st;.  if( pList-
5ff0: 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20  >nExpr!=2 ){.   
6000: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6010: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d   if( pList->a[1]
6020: 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b  .pExpr->op != TK
6030: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72  _COLUMN ){.    r
6040: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
6050: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
6060: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6070: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
6080: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ../*.** If the p
6090: 42 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  Base expression 
60a0: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
60b0: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
60c0: 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69  ause of.** a joi
60d0: 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  n, then transfer
60e0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
60f0: 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74   markings over t
6100: 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74  o derived..*/.st
6110: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66  atic void transf
6120: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45  erJoinMarkings(E
6130: 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45  xpr *pDerived, E
6140: 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 69  xpr *pBase){.  i
6150: 66 28 20 70 44 65 72 69 76 65 64 20 29 7b 0a 20  f( pDerived ){. 
6160: 20 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61     pDerived->fla
6170: 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61  gs |= pBase->fla
6180: 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  gs & EP_FromJoin
6190: 3b 0a 20 20 20 20 70 44 65 72 69 76 65 64 2d 3e  ;.    pDerived->
61a0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
61b0: 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a  = pBase->iRightJ
61c0: 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 7d 0a  oinTable;.  }.}.
61d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
61e0: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
61f0: 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64  IMIZATION) && !d
6200: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6210: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a  IT_SUBQUERY)./*.
6220: 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72  ** Analyze a ter
6230: 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  m that consists 
6240: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f  of two or more O
6250: 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73  R-connected.** s
6260: 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a  ubterms.  So in:
6270: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57  .**.**     ... W
6280: 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e 44 20  HERE  (a=5) AND 
6290: 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20 64  (b=7 OR c=9 OR d
62a0: 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33 29 0a  =13) AND (d=13).
62b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e              ^^^^
62d0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
62e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
62f0: 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 65 72  ine analyzes ter
6300: 6d 73 20 73 75 63 68 20 61 73 20 74 68 65 20 6d  ms such as the m
6310: 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20 74 68  iddle term in th
6320: 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e  e above example.
6330: 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54 65 72  .** A WhereOrTer
6340: 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d 70  m object is comp
6350: 75 74 65 64 20 61 6e 64 20 61 74 74 61 63 68 65  uted and attache
6360: 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20 75 6e  d to the term un
6370: 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c  der.** analysis,
6380: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
6390: 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68  he outcome of th
63a0: 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e  e analysis.  Hen
63b0: 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  ce:.**.**     Wh
63c0: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 20  ereTerm.wtFlags 
63d0: 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46    |=  TERM_ORINF
63e0: 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  O.**     WhereTe
63f0: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20  rm.u.pOrInfo  = 
6400: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
6410: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 4f 72  llocated WhereOr
6420: 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a  Term object.**.*
6430: 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67  * The term being
6440: 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20 68   analyzed must h
6450: 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ave two or more 
6460: 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  of OR-connected 
6470: 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73  subterms..** A s
6480: 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20 6d 69  ingle subterm mi
6490: 67 68 74 20 62 65 20 61 20 73 65 74 20 6f 66 20  ght be a set of 
64a0: 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75  AND-connected su
64b0: 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45  b-subterms..** E
64c0: 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d 73  xamples of terms
64d0: 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69 73 3a   under analysis:
64e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20 20  .**.**     (A)  
64f0: 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20     t1.x=t2.y OR 
6500: 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e  t1.x=t2.z OR t1.
6510: 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e  y=15 OR t1.z=t3.
6520: 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29 20 20  a+5.**     (B)  
6530: 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 65 78     x=expr1 OR ex
6540: 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70 72 33  pr2=x OR x=expr3
6550: 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20 20 20  .**     (C)     
6560: 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74 31  t1.x=t2.y OR (t1
6570: 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79  .x=t2.z AND t1.y
6580: 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44 29 20  =15).**     (D) 
6590: 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 28      x=expr1 OR (
65a0: 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20 41 4e  y>11 AND y<22 AN
65b0: 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f  D z LIKE '*hello
65c0: 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29 20 20  *').**     (E)  
65d0: 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e     (p.a=1 AND q.
65e0: 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f  b=2 AND r.c=3) O
65f0: 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79  R (p.x=4 AND q.y
6600: 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a  =5 AND r.z=6).**
6610: 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a  .** CASE 1:.**.*
6620: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
6630: 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72  s are of the for
6640: 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 20 73  m T.C=expr for s
6650: 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  ome single colum
6660: 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a 20 61 20  n of C and.** a 
6670: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28  single table T (
6680: 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d  as shown in exam
6690: 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68 65  ple B above) the
66a0: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76  n create a new v
66b0: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74  irtual.** term t
66c0: 68 61 74 20 69 73 20 61 6e 20 65 71 75 69 76 61  hat is an equiva
66d0: 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69  lent IN expressi
66e0: 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
66f0: 72 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d  rds, if the term
6700: 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  .** being analyz
6710: 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed is:.**.**    
6720: 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20    x = expr1  OR 
6730: 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20   expr2 = x  OR  
6740: 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20  x = expr3.**.** 
6750: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
6760: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c  w virtual term l
6770: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
6780: 20 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31       x IN (expr1
6790: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
67a0: 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a  .** CASE 2:.**.*
67b0: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
67c0: 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20  s are indexable 
67d0: 62 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  by a single tabl
67e0: 65 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  e T, then set.**
67f0: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
6800: 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20  m.eOperator     
6810: 20 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f           =  WO_O
6820: 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  R.**     WhereTe
6830: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  rm.u.pOrInfo->in
6840: 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65  dexable  |=  the
6850: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
6860: 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a  or table T.**.**
6870: 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 22 69   A subterm is "i
6880: 6e 64 65 78 61 62 6c 65 22 20 69 66 20 69 74 20  ndexable" if it 
6890: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  is of the form.*
68a0: 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70  * "T.C <op> <exp
68b0: 72 3e 22 20 77 68 65 72 65 20 43 20 69 73 20 61  r>" where C is a
68c0: 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ny column of tab
68d0: 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70  le T and .** <op
68e0: 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c  > is one of "=",
68f0: 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c   "<", "<=", ">",
6900: 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22   ">=", "IS NULL"
6910: 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20  , or "IN"..** A 
6920: 73 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20  subterm is also 
6930: 69 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74 20  indexable if it 
6940: 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f  is an AND of two
6950: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73   or more.** subs
6960: 75 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74  ubterms at least
6970: 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73   one of which is
6980: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64   indexable.  Ind
6990: 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73  exable AND .** s
69a0: 75 62 74 65 72 6d 73 20 68 61 76 65 20 74 68 65  ubterms have the
69b0: 69 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74  ir eOperator set
69c0: 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74   to WO_AND and t
69d0: 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41  hey have.** u.pA
69e0: 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20  ndInfo set to a 
69f0: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
6a00: 63 61 74 65 64 20 57 68 65 72 65 41 6e 64 54 65  cated WhereAndTe
6a10: 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  rm object..**.**
6a20: 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f   From another po
6a30: 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e  int of view, "in
6a40: 64 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74  dexable" means t
6a50: 68 61 74 20 74 68 65 20 73 75 62 74 65 72 6d 20  hat the subterm 
6a60: 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69  could.** potenti
6a70: 61 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  ally be used wit
6a80: 68 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e  h an index if an
6a90: 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
6aa0: 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68  ex exists..** Th
6ab0: 69 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73  is analysis does
6ac0: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68   not consider wh
6ad0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
6ae0: 20 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74   index exists; t
6af0: 68 61 74 0a 2a 2a 20 69 73 20 64 65 63 69 64 65  hat.** is decide
6b00: 64 20 65 6c 73 65 77 68 65 72 65 2e 20 20 54 68  d elsewhere.  Th
6b10: 69 73 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  is analysis only
6b20: 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65   looks at whethe
6b30: 72 20 73 75 62 74 65 72 6d 73 0a 2a 2a 20 61 70  r subterms.** ap
6b40: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
6b50: 64 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a  dexing exist..**
6b60: 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73  .** All examples
6b70: 20 41 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f   A through E abo
6b80: 76 65 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ve satisfy case 
6b90: 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65 72  2.  But if a ter
6ba0: 6d 0a 2a 2a 20 61 6c 73 6f 20 73 61 74 69 73 66  m.** also satisf
6bb0: 69 65 73 20 63 61 73 65 20 31 20 28 73 75 63 68  ies case 1 (such
6bc0: 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20 74   as B) we know t
6bd0: 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65  hat the optimize
6be0: 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73  r will.** always
6bf0: 20 70 72 65 66 65 72 20 63 61 73 65 20 31 2c 20   prefer case 1, 
6c00: 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
6c10: 77 65 20 70 72 65 74 65 6e 64 20 74 68 61 74 20  we pretend that 
6c20: 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a  case 2 is not.**
6c30: 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a   satisfied..**.*
6c40: 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20 74 68  * It might be th
6c50: 65 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c 74  e case that mult
6c60: 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65 20  iple tables are 
6c70: 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72 20  indexable.  For 
6c80: 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20  example,.** (E) 
6c90: 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61 62  above is indexab
6ca0: 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20  le on tables P, 
6cb0: 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20  Q, and R..**.** 
6cc0: 54 65 72 6d 73 20 74 68 61 74 20 73 61 74 69 73  Terms that satis
6cd0: 66 79 20 63 61 73 65 20 32 20 61 72 65 20 63 61  fy case 2 are ca
6ce0: 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f  ndidates for loo
6cf0: 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20  kup by using.** 
6d00: 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73  separate indices
6d10: 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73 20   to find rowids 
6d20: 66 6f 72 20 65 61 63 68 20 73 75 62 74 65 72 6d  for each subterm
6d30: 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a   and composing.*
6d40: 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61  * the union of a
6d50: 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67 20  ll rowids using 
6d60: 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e  a RowSet object.
6d70: 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61    This is simila
6d80: 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70 20  r.** to "bitmap 
6d90: 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68 65  indices" in othe
6da0: 72 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  r database engin
6db0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57  es..**.** OTHERW
6dc0: 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65  ISE:.**.** If ne
6dd0: 69 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f 72  ither case 1 nor
6de0: 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20 74   case 2 apply, t
6df0: 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65 4f  hen leave the eO
6e00: 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a  perator set to.*
6e10: 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74 65  * zero.  This te
6e20: 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c  rm is not useful
6e30: 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a   for search..*/.
6e40: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
6e50: 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20  AnalyzeOrTerm(. 
6e60: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
6e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
6e80: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
6e90: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
6ea0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC,         /* 
6eb0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48 45  the complete WHE
6ec0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
6ed0: 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20  nt idxTerm      
6ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
6ef0: 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72 6d  x of the OR-term
6f00: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
6f10: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
6f20: 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d  o *pWInfo = pWC-
6f30: 3e 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  >pWInfo;        
6f40: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
6f50: 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65  processing conte
6f60: 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  xt */.  Parse *p
6f70: 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
6f80: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
6f90: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
6fa0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
6fb0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6fd0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
6fe0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ction */.  Where
6ff0: 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  Term *pTerm = &p
7000: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20  WC->a[idxTerm]; 
7010: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74     /* The term t
7020: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
7030: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d  .  Expr *pExpr =
7040: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20   pTerm->pExpr;  
7050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7060: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
7070: 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  the term */.  in
7080: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
7090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70a0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
70b0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
70c0: 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20  eClause *pOrWc; 
70d0: 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75 70        /* Breakup
70e0: 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20 73   of pTerm into s
70f0: 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65  ubterms */.  Whe
7100: 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
7110: 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62 2d         /* A Sub-
7120: 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20  term within the 
7130: 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72 65  pOrWc */.  Where
7140: 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b  OrInfo *pOrInfo;
7150: 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e       /* Addition
7160: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  al information a
7170: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
7180: 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Term */.  Bitmas
7190: 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20  k chngToIN;     
71a0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68      /* Tables th
71b0: 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79  at might satisfy
71c0: 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69 74   case 1 */.  Bit
71d0: 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20  mask indexable; 
71e0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
71f0: 20 74 68 61 74 20 61 72 65 20 69 6e 64 65 78 61   that are indexa
7200: 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67 20  ble, satisfying 
7210: 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a  case 2 */..  /*.
7220: 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20 4f    ** Break the O
7230: 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69 74  R clause into it
7240: 73 20 73 65 70 61 72 61 74 65 20 73 75 62 74 65  s separate subte
7250: 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65 72  rms.  The subter
7260: 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72  ms are.  ** stor
7270: 65 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c 61  ed in a WhereCla
7280: 75 73 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  use structure co
7290: 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e 20  ntaining within 
72a0: 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a  the WhereOrInfo.
72b0: 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74    ** object that
72c0: 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20   is attached to 
72d0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20  the original OR 
72e0: 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a  clause term..  *
72f0: 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65  /.  assert( (pTe
7300: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
7310: 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d  ERM_DYNAMIC|TERM
7320: 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44  _ORINFO|TERM_AND
7330: 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61  INFO))==0 );.  a
7340: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
7350: 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65  ==TK_OR );.  pTe
7360: 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20  rm->u.pOrInfo = 
7370: 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  pOrInfo = sqlite
7380: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
7390: 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66  , sizeof(*pOrInf
73a0: 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e  o));.  if( pOrIn
73b0: 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  fo==0 ) return;.
73c0: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
73d0: 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b   |= TERM_ORINFO;
73e0: 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72 49  .  pOrWc = &pOrI
73f0: 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65  nfo->wc;.  where
7400: 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63  ClauseInit(pOrWc
7410: 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68 65  , pWInfo);.  whe
7420: 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20 70  reSplit(pOrWc, p
7430: 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20  Expr, TK_OR);.  
7440: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
7450: 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69  Src, pOrWc);.  i
7460: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
7470: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
7480: 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e  assert( pOrWc->n
7490: 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a  Term>=2 );..  /*
74a0: 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  ** Compute th
74b0: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
74c0: 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73  that might satis
74d0: 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32 2e  fy cases 1 or 2.
74e0: 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c  .  */.  indexabl
74f0: 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  e = ~(Bitmask)0;
7500: 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28  .  chngToIN = ~(
7510: 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
7520: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
7530: 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63  1, pOrTerm=pOrWc
7540: 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64  ->a; i>=0 && ind
7550: 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72  exable; i--, pOr
7560: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
7570: 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
7580: 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45  ator & WO_SINGLE
7590: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68  )==0 ){.      Wh
75a0: 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64  ereAndInfo *pAnd
75b0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65  Info;.      asse
75c0: 72 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74  rt( (pOrTerm->wt
75d0: 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e  Flags & (TERM_AN
75e0: 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46  DINFO|TERM_ORINF
75f0: 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  O))==0 );.      
7600: 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20  chngToIN = 0;.  
7610: 20 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73      pAndInfo = s
7620: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7630: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41  w(db, sizeof(*pA
7640: 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20  ndInfo));.      
7650: 69 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a  if( pAndInfo ){.
7660: 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61          WhereCla
7670: 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20  use *pAndWC;.   
7680: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
7690: 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20  pAndTerm;.      
76a0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
76b0: 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a   Bitmask b = 0;.
76c0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
76d0: 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41  >u.pAndInfo = pA
76e0: 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ndInfo;.        
76f0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
7700: 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f   |= TERM_ANDINFO
7710: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
7720: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
7730: 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70  O_AND;.        p
7740: 41 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66  AndWC = &pAndInf
7750: 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 77  o->wc;.        w
7760: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70  hereClauseInit(p
7770: 41 6e 64 57 43 2c 20 70 57 43 2d 3e 70 57 49 6e  AndWC, pWC->pWIn
7780: 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65  fo);.        whe
7790: 72 65 53 70 6c 69 74 28 70 41 6e 64 57 43 2c 20  reSplit(pAndWC, 
77a0: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  pOrTerm->pExpr, 
77b0: 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20 20  TK_AND);.       
77c0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
77d0: 70 53 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20  pSrc, pAndWC);. 
77e0: 20 20 20 20 20 20 20 70 41 6e 64 57 43 2d 3e 70         pAndWC->p
77f0: 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20  Outer = pWC;.   
7800: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64       testcase( d
7810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7820: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
7830: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7840: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
7850: 72 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d  r(j=0, pAndTerm=
7860: 70 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e  pAndWC->a; j<pAn
7870: 64 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  dWC->nTerm; j++,
7880: 20 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20   pAndTerm++){.  
7890: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
78a0: 28 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70  ( pAndTerm->pExp
78b0: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
78c0: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70   if( allowedOp(p
78d0: 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  AndTerm->pExpr->
78e0: 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  op) ){.         
78f0: 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73       b |= getMas
7900: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
7910: 53 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c  Set, pAndTerm->l
7920: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
7930: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7940: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7950: 20 20 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c          indexabl
7960: 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a  e &= b;.      }.
7970: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
7980: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
7990: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a   TERM_COPIED ){.
79a0: 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68        /* Skip th
79b0: 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e  is term for now.
79c0: 20 20 57 65 20 72 65 76 69 73 69 74 20 69 74 20    We revisit it 
79d0: 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20  when we process 
79e0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  the.      ** cor
79f0: 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f  responding TERM_
7a00: 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a  VIRTUAL term */.
7a10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7a20: 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20   Bitmask b;.    
7a30: 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 26 70    b = getMask(&p
7a40: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
7a50: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
7a60: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28  rsor);.      if(
7a70: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
7a80: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
7a90: 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
7aa0: 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20  eTerm *pOther = 
7ab0: 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72  &pOrWc->a[pOrTer
7ac0: 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
7ad0: 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73       b |= getMas
7ae0: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
7af0: 53 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66  Set, pOther->lef
7b00: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
7b10: 7d 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c  }.      indexabl
7b20: 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66  e &= b;.      if
7b30: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
7b40: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d  rator & WO_EQ)==
7b50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e  0 ){.        chn
7b60: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
7b70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7b80: 63 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20  chngToIN &= b;. 
7b90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7ba0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f  ..  /*.  ** Reco
7bb0: 72 64 20 74 68 65 20 73 65 74 20 6f 66 20 74 61  rd the set of ta
7bc0: 62 6c 65 73 20 74 68 61 74 20 73 61 74 69 73 66  bles that satisf
7bd0: 79 20 63 61 73 65 20 32 2e 20 20 54 68 65 20 73  y case 2.  The s
7be0: 65 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a  et might be.  **
7bf0: 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70   empty..  */.  p
7c00: 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
7c10: 65 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20  e = indexable;. 
7c20: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
7c30: 72 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30  r = indexable==0
7c40: 20 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20   ? 0 : WO_OR;.. 
7c50: 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49   /*.  ** chngToI
7c60: 4e 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66  N holds a set of
7c70: 20 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69   tables that *mi
7c80: 67 68 74 2a 20 73 61 74 69 73 66 79 20 63 61 73  ght* satisfy cas
7c90: 65 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77  e 1.  But.  ** w
7ca0: 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d  e have to do som
7cb0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65  e additional che
7cc0: 63 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20  cking to see if 
7cd0: 63 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20  case 1 really.  
7ce0: 2a 2a 20 69 73 20 73 61 74 69 73 66 69 65 64 2e  ** is satisfied.
7cf0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54  .  **.  ** chngT
7d00: 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69  oIN will hold ei
7d10: 74 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20  ther 0, 1, or 2 
7d20: 62 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74  bits.  The 0-bit
7d30: 20 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a   case means.  **
7d40: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
7d50: 6f 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66  o possibility of
7d60: 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68   transforming th
7d70: 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f  e OR clause into
7d80: 20 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72   an.  ** IN oper
7d90: 61 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65  ator because one
7da0: 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69   or more terms i
7db0: 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  n the OR clause 
7dc0: 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d  contain.  ** som
7dd0: 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
7de0: 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  n == on a column
7df0: 20 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74   in the single t
7e00: 61 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74  able.  The 1-bit
7e10: 0a 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73  .  ** case means
7e20: 20 74 68 61 74 20 65 76 65 72 79 20 74 65 72 6d   that every term
7e30: 20 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73   of the OR claus
7e40: 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  e is of the form
7e50: 0a 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c  .  ** "table.col
7e60: 75 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f  umn=expr" for so
7e70: 6d 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e  me single table.
7e80: 20 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68    The one bit th
7e90: 61 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77  at is set.  ** w
7ea0: 69 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  ill correspond t
7eb0: 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62  o the common tab
7ec0: 6c 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65  le.  We still ne
7ed0: 65 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d  ed to check to m
7ee0: 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68  ake.  ** sure th
7ef0: 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73  e same column is
7f00: 20 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72   used on all ter
7f10: 6d 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63  ms.  The 2-bit c
7f20: 61 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a  ase is when.  **
7f30: 20 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61   the all terms a
7f40: 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  re of the form "
7f50: 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61  table1.column=ta
7f60: 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49  ble2.column".  I
7f70: 74 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20  t.  ** might be 
7f80: 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d  possible to form
7f90: 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   an IN operator 
7fa0: 77 69 74 68 20 65 69 74 68 65 72 20 74 61 62 6c  with either tabl
7fb0: 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f  e1.column.  ** o
7fc0: 72 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20  r table2.column 
7fd0: 61 73 20 74 68 65 20 4c 48 53 20 69 66 20 65 69  as the LHS if ei
7fe0: 74 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  ther is common t
7ff0: 6f 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a  o every term of.
8000: 20 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75    ** the OR clau
8010: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  se..  **.  ** No
8020: 74 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66  te that terms of
8030: 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65   the form "table
8040: 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63  .column1=table.c
8050: 6f 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a  olumn2" (the.  *
8060: 2a 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20  * same table on 
8070: 62 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68  both sizes of th
8080: 65 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20  e ==) cannot be 
8090: 6f 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a  optimized..  */.
80a0: 20 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29    if( chngToIN )
80b0: 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68  {.    int okToCh
80c0: 6e 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20  ngToIN = 0;     
80d0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 63  /* True if the c
80e0: 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20  onversion to IN 
80f0: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20  is valid */.    
8100: 69 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31  int iColumn = -1
8110: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c  ;         /* Col
8120: 75 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73  umn index on lhs
8130: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
8140: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73  */.    int iCurs
8150: 6f 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  or = -1;        
8160: 20 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72   /* Table cursor
8170: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74   common to all t
8180: 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  erms */.    int 
8190: 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  j = 0;          
81a0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
81b0: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  unter */..    /*
81c0: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 61   Search for a ta
81d0: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74  ble and column t
81e0: 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f  hat appears on o
81f0: 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20  ne side or the. 
8200: 20 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74     ** other of t
8210: 68 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69  he == operator i
8220: 6e 20 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e  n every subterm.
8230: 20 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64    That table and
8240: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77   column.    ** w
8250: 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20  ill be recorded 
8260: 69 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69  in iCursor and i
8270: 43 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d  Column.  There m
8280: 69 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a  ight not be any.
8290: 20 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c      ** such tabl
82a0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53  e and column.  S
82b0: 65 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  et okToChngToIN 
82c0: 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  if an appropriat
82d0: 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61  e table.    ** a
82e0: 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75  nd column is fou
82f0: 6e 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54  nd but leave okT
8300: 6f 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20  oChngToIN false 
8310: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
8320: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30    */.    for(j=0
8330: 3b 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68  ; j<2 && !okToCh
8340: 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20  ngToIN; j++){.  
8350: 20 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f      pOrTerm = pO
8360: 72 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f  rWc->a;.      fo
8370: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
8380: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  -1; i>=0; i--, p
8390: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
83a0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
83b0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
83c0: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
83d0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
83e0: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
83f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
8400: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
8410: 72 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  r==iCursor ){.  
8420: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
8430: 69 73 20 74 68 65 20 32 2d 62 69 74 20 63 61 73  is the 2-bit cas
8440: 65 20 61 6e 64 20 77 65 20 61 72 65 20 6f 6e 20  e and we are on 
8450: 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61  the second itera
8460: 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
8470: 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 65     ** current te
8480: 72 6d 20 69 73 20 66 72 6f 6d 20 74 68 65 20 66  rm is from the f
8490: 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20  irst iteration. 
84a0: 20 53 6f 20 73 6b 69 70 20 74 68 69 73 20 74 65   So skip this te
84b0: 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  rm. */.         
84c0: 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b   assert( j==1 );
84d0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
84e0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
84f0: 20 20 20 20 20 20 20 69 66 28 20 28 63 68 6e 67         if( (chng
8500: 54 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b 28 26  ToIN & getMask(&
8510: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
8520: 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  , pOrTerm->leftC
8530: 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20 20  ursor))==0 ){.  
8540: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
8550: 74 65 72 6d 20 6d 75 73 74 20 62 65 20 6f 66 20  term must be of 
8560: 74 68 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d 74  the form t1.a==t
8570: 32 2e 62 20 77 68 65 72 65 20 74 32 20 69 73 20  2.b where t2 is 
8580: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
8590: 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65 74   ** chngToIN set
85a0: 20 62 75 74 20 74 31 20 69 73 20 6e 6f 74 2e 20   but t1 is not. 
85b0: 20 54 68 69 73 20 74 65 72 6d 20 77 69 6c 6c 20   This term will 
85c0: 62 65 20 65 69 74 68 65 72 20 70 72 65 63 65 64  be either preced
85d0: 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
85e0: 6f 72 20 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e  or follwed by an
85f0: 20 69 6e 76 65 72 74 65 64 20 63 6f 70 79 20 28   inverted copy (
8600: 74 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b  t2.b==t1.a).  Sk
8610: 69 70 20 74 68 69 73 20 74 65 72 6d 20 0a 20 20  ip this term .  
8620: 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 75          ** and u
8630: 73 65 20 69 74 73 20 69 6e 76 65 72 73 69 6f 6e  se its inversion
8640: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  . */.          t
8650: 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d  estcase( pOrTerm
8660: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
8670: 5f 43 4f 50 49 45 44 20 29 3b 0a 20 20 20 20 20  _COPIED );.     
8680: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
8690: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
86a0: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
86b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
86c0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  rt( pOrTerm->wtF
86d0: 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 50  lags & (TERM_COP
86e0: 49 45 44 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c  IED|TERM_VIRTUAL
86f0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ) );.          c
8700: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
8710: 20 7d 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75   }.        iColu
8720: 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e  mn = pOrTerm->u.
8730: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
8740: 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20 70 4f      iCursor = pO
8750: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
8760: 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  r;.        break
8770: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8780: 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20  if( i<0 ){.     
8790: 20 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61     /* No candida
87a0: 74 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20  te table+column 
87b0: 77 61 73 20 66 6f 75 6e 64 2e 20 20 54 68 69 73  was found.  This
87c0: 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a   can only occur.
87d0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68          ** on th
87e0: 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69  e second iterati
87f0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  on */.        as
8800: 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20  sert( j==1 );.  
8810: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73        assert( Is
8820: 50 6f 77 65 72 4f 66 54 77 6f 28 63 68 6e 67 54  PowerOfTwo(chngT
8830: 6f 49 4e 29 20 29 3b 0a 20 20 20 20 20 20 20 20  oIN) );.        
8840: 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e  assert( chngToIN
8850: 3d 3d 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  ==getMask(&pWInf
8860: 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75  o->sMaskSet, iCu
8870: 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20  rsor) );.       
8880: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
8890: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
88a0: 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f  j==1 );..      /
88b0: 2a 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20  * We have found 
88c0: 61 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c  a candidate tabl
88d0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43  e and column.  C
88e0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
88f0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  hat.      ** tab
8900: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73  le and column is
8910: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79   common to every
8920: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20   term in the OR 
8930: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
8940: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31  okToChngToIN = 1
8950: 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e  ;.      for(; i>
8960: 3d 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f  =0 && okToChngTo
8970: 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  IN; i--, pOrTerm
8980: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
8990: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
89a0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
89b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
89c0: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
89d0: 6f 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  or!=iCursor ){. 
89e0: 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d           pOrTerm
89f0: 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45  ->wtFlags &= ~TE
8a00: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
8a10: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
8a20: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
8a30: 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n!=iColumn ){.  
8a40: 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67          okToChng
8a50: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
8a60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8a70: 20 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20     int affLeft, 
8a80: 61 66 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20  affRight;.      
8a90: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69      /* If the ri
8aa0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
8ab0: 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20   also a column, 
8ac0: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
8ad0: 69 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ies.          **
8ae0: 20 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20 61   of both right a
8af0: 6e 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75  nd left sides mu
8b00: 73 74 20 62 65 20 73 75 63 68 20 74 68 61 74 20  st be such that 
8b10: 6e 6f 20 74 79 70 65 0a 20 20 20 20 20 20 20 20  no type.        
8b20: 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73    ** conversions
8b30: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e   are required on
8b40: 20 74 68 65 20 72 69 67 68 74 2e 20 20 28 54 69   the right.  (Ti
8b50: 63 6b 65 74 20 23 32 32 34 39 29 0a 20 20 20 20  cket #2249).    
8b60: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
8b70: 20 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71     affRight = sq
8b80: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
8b90: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
8ba0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
8bb0: 20 20 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73       affLeft = s
8bc0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
8bd0: 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  ty(pOrTerm->pExp
8be0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
8bf0: 20 20 20 20 20 69 66 28 20 61 66 66 52 69 67 68       if( affRigh
8c00: 74 21 3d 30 20 26 26 20 61 66 66 52 69 67 68 74  t!=0 && affRight
8c10: 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20  !=affLeft ){.   
8c20: 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e           okToChn
8c30: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
8c40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8c50: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
8c60: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
8c70: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
8c80: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
8c90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
8ca0: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
8cb0: 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  t, okToChngToIN 
8cc0: 69 73 20 74 72 75 65 20 69 66 20 6f 72 69 67 69  is true if origi
8cd0: 6e 61 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66  nal pTerm satisf
8ce0: 69 65 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  ies.    ** case 
8cf0: 31 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  1.  In that case
8d00: 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  , construct a ne
8d10: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74  w virtual term t
8d20: 68 61 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70  hat is .    ** p
8d30: 54 65 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69  Term converted i
8d40: 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74  nto an IN operat
8d50: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
8d60: 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  f( okToChngToIN 
8d70: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
8d80: 44 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Dup;            
8d90: 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64  /* A transient d
8da0: 75 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73  uplicate express
8db0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
8dc0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30  rList *pList = 0
8dd0: 3b 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f  ;   /* The RHS o
8de0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
8df0: 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
8e00: 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20  *pLeft = 0;     
8e10: 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20    /* The LHS of 
8e20: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
8e30: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
8e40: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
8e50: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
8e60: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a  IN operator */..
8e70: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57        for(i=pOrW
8e80: 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  c->nTerm-1, pOrT
8e90: 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e  erm=pOrWc->a; i>
8ea0: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
8eb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
8ec0: 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61   (pOrTerm->wtFla
8ed0: 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29  gs & TERM_OR_OK)
8ee0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
8ef0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8f00: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
8f10: 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
8f20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
8f30: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
8f40: 72 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20  r==iCursor );.  
8f50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
8f60: 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  rTerm->u.leftCol
8f70: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a  umn==iColumn );.
8f80: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
8f90: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
8fa0: 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  , pOrTerm->pExpr
8fb0: 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
8fc0: 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71        pList = sq
8fd0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
8fe0: 65 6e 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  end(pWInfo->pPar
8ff0: 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 29  se, pList, pDup)
9000: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20  ;.        pLeft 
9010: 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  = pOrTerm->pExpr
9020: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d  ->pLeft;.      }
9030: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9040: 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Left!=0 );.     
9050: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
9060: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
9070: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
9080: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
9090: 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70  pParse, TK_IN, p
90a0: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
90b0: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
90c0: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
90d0: 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73 66  ;.        transf
90e0: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
90f0: 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
9100: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
9110: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
9120: 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  ew, EP_xIsSelect
9130: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
9140: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
9150: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e  st;.        idxN
9160: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
9170: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
9180: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
9190: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
91a0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
91b0: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
91c0: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
91d0: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
91e0: 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  ew);.        pTe
91f0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
9200: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70  Term];.        p
9210: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50  WC->a[idxNew].iP
9220: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
9230: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
9240: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
9250: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9260: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9270: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
9280: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9290: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
92a0: 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a  r = WO_NOOP;  /*
92b0: 20 63 61 73 65 20 31 20 74 72 75 6d 70 73 20 63   case 1 trumps c
92c0: 61 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d 0a 20  ase 2 */.    }. 
92d0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
92e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
92f0: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26 20 21  PTIMIZATION && !
9300: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
9310: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  UERY */../*.** T
9320: 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73  he input to this
9330: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 57   routine is an W
9340: 68 65 72 65 54 65 72 6d 20 73 74 72 75 63 74 75  hereTerm structu
9350: 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74 68 65  re with only the
9360: 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69 65 6c  .** "pExpr" fiel
9370: 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68  d filled in.  Th
9380: 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
9390: 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c  utine is to anal
93a0: 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62 65 78  yze the.** subex
93b0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70  pression and pop
93c0: 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20 6f 74  ulate all the ot
93d0: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 74 68  her fields of th
93e0: 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73  e WhereTerm.** s
93f0: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
9400: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9410: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
9420: 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22   "<expr> <op> X"
9430: 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75 74 65   it gets commute
9440: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 6e  d.** to the stan
9450: 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22 58 20  dard form of "X 
9460: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a  <op> <expr>"..**
9470: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
9480: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
9490: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20  form "X <op> Y" 
94a0: 77 68 65 72 65 20 62 6f 74 68 20 58 20 61 6e 64  where both X and
94b0: 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e   Y are.** column
94c0: 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  s, then the orig
94d0: 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20  inal expression 
94e0: 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
94f0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a   a new virtual.*
9500: 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  * term of the fo
9510: 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22 20 69 73  rm "Y <op> X" is
9520: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 57 48   added to the WH
9530: 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a  ERE clause and.*
9540: 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65 70 61 72  * analyzed separ
9550: 61 74 65 6c 79 2e 20 20 54 68 65 20 6f 72 69 67  ately.  The orig
9560: 69 6e 61 6c 20 74 65 72 6d 20 69 73 20 6d 61 72  inal term is mar
9570: 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 43 4f  ked with TERM_CO
9580: 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74 68 65 20  PIED.** and the 
9590: 6e 65 77 20 74 65 72 6d 20 69 73 20 6d 61 72 6b  new term is mark
95a0: 65 64 20 77 69 74 68 20 54 45 52 4d 5f 44 59 4e  ed with TERM_DYN
95b0: 41 4d 49 43 20 28 62 65 63 61 75 73 65 20 69 74  AMIC (because it
95c0: 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e 65 65 64  's pExpr.** need
95d0: 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 69  s to be freed wi
95e0: 74 68 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  th the WhereClau
95f0: 73 65 29 20 61 6e 64 20 54 45 52 4d 5f 56 49 52  se) and TERM_VIR
9600: 54 55 41 4c 20 28 62 65 63 61 75 73 65 20 69 74  TUAL (because it
9610: 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d 75 74 65  .** is a commute
9620: 64 20 63 6f 70 79 20 6f 66 20 61 20 70 72 69 6f  d copy of a prio
9630: 72 20 74 65 72 6d 2e 29 20 20 54 68 65 20 6f 72  r term.)  The or
9640: 69 67 69 6e 61 6c 20 74 65 72 6d 20 68 61 73 20  iginal term has 
9650: 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20  nChild=1.** and 
9660: 74 68 65 20 63 6f 70 79 20 68 61 73 20 69 64 78  the copy has idx
9670: 50 61 72 65 6e 74 20 73 65 74 20 74 6f 20 74 68  Parent set to th
9680: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6f  e index of the o
9690: 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f  riginal term..*/
96a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
96b0: 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c  rAnalyze(.  SrcL
96c0: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
96d0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
96e0: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
96f0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
9700: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
9710: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
9720: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20   int idxTerm    
9730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9740: 64 65 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20  dex of the term 
9750: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
9760: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
9770: 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e   *pWInfo = pWC->
9780: 70 57 49 6e 66 6f 3b 20 2f 2a 20 57 48 45 52 45  pWInfo; /* WHERE
9790: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
97a0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
97b0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
97c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
97d0: 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20   /* The term to 
97e0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  be analyzed */. 
97f0: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
9800: 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20 20  MaskSet;        
9810: 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61 62 6c    /* Set of tabl
9820: 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f  e index masks */
9830: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20  .  Expr *pExpr; 
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9850: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
9860: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c  ssion to be anal
9870: 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73  yzed */.  Bitmas
9880: 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20 20 20  k prereqLeft;   
9890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
98a0: 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 74  erequesites of t
98b0: 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  he pExpr->pLeft 
98c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
98d0: 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  reqAll;         
98e0: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75        /* Prerequ
98f0: 65 73 69 74 65 73 20 6f 66 20 70 45 78 70 72 20  esites of pExpr 
9900: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74  */.  Bitmask ext
9910: 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20 20 20  raRight = 0;    
9920: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 64        /* Extra d
9930: 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 4c  ependencies on L
9940: 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78  EFT JOIN */.  Ex
9950: 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b 20 20  pr *pStr1 = 0;  
9960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9970: 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c  * RHS of LIKE/GL
9980: 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  OB operator */. 
9990: 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 20   int isComplete 
99a0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
99b0: 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45    /* RHS of LIKE
99c0: 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74 68 20  /GLOB ends with 
99d0: 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 69 6e  wildcard */.  in
99e0: 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20 20 20  t noCase = 0;   
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9a00: 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69 73 74  * LIKE/GLOB dist
9a10: 69 6e 67 75 69 73 68 65 73 20 63 61 73 65 20 2a  inguishes case *
9a20: 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a40: 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65       /* Top-leve
9a50: 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78  l operator.  pEx
9a60: 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73  pr->op */.  Pars
9a70: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
9a80: 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 2f 2a 20  fo->pParse;  /* 
9a90: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
9aa0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
9ab0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
9ac0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
9ad0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
9ae0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
9af0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
9b00: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65  eturn;.  }.  pTe
9b10: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
9b20: 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65  Term];.  pMaskSe
9b30: 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  t = &pWInfo->sMa
9b40: 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d  skSet;.  pExpr =
9b50: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
9b60: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
9b70: 6f 70 21 3d 54 4b 5f 41 53 20 26 26 20 70 45 78  op!=TK_AS && pEx
9b80: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41  pr->op!=TK_COLLA
9b90: 54 45 20 29 3b 0a 20 20 70 72 65 72 65 71 4c 65  TE );.  prereqLe
9ba0: 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ft = exprTableUs
9bb0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
9bc0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f  xpr->pLeft);.  o
9bd0: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
9be0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29   if( op==TK_IN )
9bf0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
9c00: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
9c10: 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
9c20: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
9c30: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
9c40: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
9c50: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
9c60: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
9c70: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
9c80: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  r->x.pSelect);. 
9c90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9ca0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
9cb0: 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62  ht = exprListTab
9cc0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
9cd0: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
9ce0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
9cf0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55   if( op==TK_ISNU
9d00: 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  LL ){.    pTerm-
9d10: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
9d20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
9d30: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
9d40: 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  t = exprTableUsa
9d50: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
9d60: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d  pr->pRight);.  }
9d70: 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65  .  prereqAll = e
9d80: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
9d90: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a  askSet, pExpr);.
9da0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
9db0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
9dc0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
9dd0: 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74   Bitmask x = get
9de0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
9df0: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
9e00: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72  Table);.    prer
9e10: 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20  eqAll |= x;.    
9e20: 65 78 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31  extraRight = x-1
9e30: 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20  ;  /* ON clause 
9e40: 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65  terms may not be
9e50: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
9e60: 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20  dex.            
9e70: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
9e80: 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61   left table of a
9e90: 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63   LEFT JOIN.  Tic
9ea0: 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d  ket #3015 */.  }
9eb0: 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  .  pTerm->prereq
9ec0: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
9ed0: 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  .  pTerm->leftCu
9ee0: 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rsor = -1;.  pTe
9ef0: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31  rm->iParent = -1
9f00: 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  ;.  pTerm->eOper
9f10: 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ator = 0;.  if( 
9f20: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b  allowedOp(op) ){
9f30: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
9f40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
9f50: 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d  ipCollate(pExpr-
9f60: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 45 78 70  >pLeft);.    Exp
9f70: 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r *pRight = sqli
9f80: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
9f90: 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  te(pExpr->pRight
9fa0: 29 3b 0a 20 20 20 20 75 31 36 20 6f 70 4d 61 73  );.    u16 opMas
9fb0: 6b 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  k = (pTerm->prer
9fc0: 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71  eqRight & prereq
9fd0: 4c 65 66 74 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c  Left)==0 ? WO_AL
9fe0: 4c 20 3a 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20  L : WO_EQUIV;.  
9ff0: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
a000: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
a010: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
a020: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
a030: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65  Table;.      pTe
a040: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
a050: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
a060: 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  n;.      pTerm->
a070: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  eOperator = oper
a080: 61 74 6f 72 4d 61 73 6b 28 6f 70 29 20 26 20 6f  atorMask(op) & o
a090: 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  pMask;.    }.   
a0a0: 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70   if( pRight && p
a0b0: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  Right->op==TK_CO
a0c0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68  LUMN ){.      Wh
a0d0: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20  ereTerm *pNew;. 
a0e0: 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b       Expr *pDup;
a0f0: 0a 20 20 20 20 20 20 75 31 36 20 65 45 78 74 72  .      u16 eExtr
a100: 61 4f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  aOp = 0;        
a110: 2f 2a 20 45 78 74 72 61 20 62 69 74 73 20 66 6f  /* Extra bits fo
a120: 72 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f  r pNew->eOperato
a130: 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  r */.      if( p
a140: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
a150: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=0 ){.        i
a160: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
a170: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
a180: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
a190: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
a1a0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
a1b0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
a1c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
a1d0: 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20  ete(db, pDup);. 
a1e0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
a1f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a200: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
a210: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
a220: 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49  C, pDup, TERM_VI
a230: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
a240: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IC);.        if(
a250: 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74   idxNew==0 ) ret
a260: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  urn;.        pNe
a270: 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  w = &pWC->a[idxN
a280: 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ew];.        pNe
a290: 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w->iParent = idx
a2a0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
a2b0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
a2c0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20  xTerm];.        
a2d0: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
a2e0: 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  1;.        pTerm
a2f0: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
a300: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
a310: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
a320: 3d 54 4b 5f 45 51 0a 20 20 20 20 20 20 20 20 20  =TK_EQ.         
a330: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
a340: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
a350: 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20  omJoin).        
a360: 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
a370: 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
a380: 54 45 5f 54 72 61 6e 73 69 74 69 76 65 29 0a 20  TE_Transitive). 
a390: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
a3a0: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
a3b0: 61 74 6f 72 20 7c 3d 20 57 4f 5f 45 51 55 49 56  ator |= WO_EQUIV
a3c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 45 78 74  ;.          eExt
a3d0: 72 61 4f 70 20 3d 20 57 4f 5f 45 51 55 49 56 3b  raOp = WO_EQUIV;
a3e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a3f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a400: 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20  pDup = pExpr;.  
a410: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65        pNew = pTe
a420: 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
a430: 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50    exprCommute(pP
a440: 61 72 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20  arse, pDup);.   
a450: 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
a460: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
a470: 65 28 70 44 75 70 2d 3e 70 4c 65 66 74 29 3b 0a  e(pDup->pLeft);.
a480: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74        pNew->left
a490: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
a4a0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
a4b0: 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  ew->u.leftColumn
a4c0: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
a4d0: 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  n;.      testcas
a4e0: 65 28 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c  e( (prereqLeft |
a4f0: 20 65 78 74 72 61 52 69 67 68 74 29 20 21 3d 20   extraRight) != 
a500: 70 72 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20  prereqLeft );.  
a510: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
a520: 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65  Right = prereqLe
a530: 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b  ft | extraRight;
a540: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
a550: 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41  reqAll = prereqA
a560: 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ll;.      pNew->
a570: 65 4f 70 65 72 61 74 6f 72 20 3d 20 28 6f 70 65  eOperator = (ope
a580: 72 61 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e  ratorMask(pDup->
a590: 6f 70 29 20 2b 20 65 45 78 74 72 61 4f 70 29 20  op) + eExtraOp) 
a5a0: 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  & opMask;.    }.
a5b0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
a5c0: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
a5d0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
a5e0: 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20  /* If a term is 
a5f0: 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72  the BETWEEN oper
a600: 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f  ator, create two
a610: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
a620: 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66  ms.  ** that def
a630: 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68  ine the range th
a640: 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  at the BETWEEN i
a650: 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20  mplements.  For 
a660: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
a670: 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57 45 45  **      a BETWEE
a680: 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20  N b AND c.  **. 
a690: 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64   ** is converted
a6a0: 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
a6b0: 20 20 20 20 20 20 28 61 20 42 45 54 57 45 45 4e        (a BETWEEN
a6c0: 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61   b AND c) AND (a
a6d0: 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a  >=b) AND (a<=c).
a6e0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77    **.  ** The tw
a6f0: 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  o new terms are 
a700: 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  added onto the e
a710: 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72 65 43  nd of the WhereC
a720: 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20  lause object..  
a730: 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73  ** The new terms
a740: 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61   are "dynamic" a
a750: 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20  nd are children 
a760: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
a770: 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72  BETWEEN.  ** ter
a780: 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74  m.  That means t
a790: 68 61 74 20 69 66 20 74 68 65 20 42 45 54 57 45  hat if the BETWE
a7a0: 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64  EN term is coded
a7b0: 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61  , the children a
a7c0: 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e  re.  ** skipped.
a7d0: 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69    Or, if the chi
a7e0: 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69 73 66  ldren are satisf
a7f0: 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c  ied by an index,
a800: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
a810: 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  ** BETWEEN term 
a820: 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  is skipped..  */
a830: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
a840: 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45  r->op==TK_BETWEE
a850: 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  N && pWC->op==TK
a860: 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72  _AND ){.    Expr
a870: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
a880: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
a890: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61    int i;.    sta
a8a0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73  tic const u8 ops
a8b0: 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f  [] = {TK_GE, TK_
a8c0: 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  LE};.    assert(
a8d0: 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20   pList!=0 );.   
a8e0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
a8f0: 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20  nExpr==2 );.    
a900: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
a910: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
a920: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
a930: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
a940: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
a950: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
a960: 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20  , ops[i], .     
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a980: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
a990: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
a9a0: 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20  ->pLeft, 0),.   
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a9d0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69  3ExprDup(db, pLi
a9e0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
a9f0: 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 74 72  0), 0);.      tr
aa00: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e  ansferJoinMarkin
aa10: 67 73 28 70 4e 65 77 45 78 70 72 2c 20 70 45 78  gs(pNewExpr, pEx
aa20: 70 72 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65  pr);.      idxNe
aa30: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
aa40: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
aa50: 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  xpr, TERM_VIRTUA
aa60: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
aa70: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
aa80: 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20   idxNew==0 );.  
aa90: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
aaa0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
aab0: 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  w);.      pTerm 
aac0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
aad0: 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  m];.      pWC->a
aae0: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
aaf0: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
ab00: 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68  }.    pTerm->nCh
ab10: 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e  ild = 2;.  }.#en
ab20: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
ab30: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
ab40: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20  IZATION */..#if 
ab50: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
ab60: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
ab70: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
ab80: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
ab90: 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61  BQUERY).  /* Ana
aba0: 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74  lyze a term that
abb0: 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20   is composed of 
abc0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74  two or more subt
abd0: 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
abe0: 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65  y.  ** an OR ope
abf0: 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c  rator..  */.  el
ac00: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
ac10: 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61  ==TK_OR ){.    a
ac20: 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d  ssert( pWC->op==
ac30: 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78  TK_AND );.    ex
ac40: 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28  prAnalyzeOrTerm(
ac50: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65  pSrc, pWC, idxTe
ac60: 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  rm);.    pTerm =
ac70: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
ac80: 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ];.  }.#endif /*
ac90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
aca0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
acb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
acc0: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
acd0: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20  ZATION.  /* Add 
ace0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72  constraints to r
acf0: 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68  educe the search
ad00: 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45   space on a LIKE
ad10: 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70   or GLOB.  ** op
ad20: 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  erator..  **.  *
ad30: 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e  * A like pattern
ad40: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20   of the form "x 
ad50: 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69 73 20  LIKE 'abc%'" is 
ad60: 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e  changed into con
ad70: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20  straints.  **.  
ad80: 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27  **          x>='
ad90: 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27  abc' AND x<'abd'
ada0: 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63   AND x LIKE 'abc
adb0: 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  %'.  **.  ** The
adc0: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
add0: 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 22 61  of the prefix "a
ade0: 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  bc" is increment
adf0: 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20  ed to form the. 
ae00: 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20   ** termination 
ae10: 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e  condition "abd".
ae20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d  .  */.  if( pWC-
ae30: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20  >op==TK_AND .   
ae40: 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  && isLikeOrGlob(
ae50: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
ae60: 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65  pStr1, &isComple
ae70: 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 29  te, &noCase).  )
ae80: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  {.    Expr *pLef
ae90: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20  t;       /* LHS 
aea0: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65  of LIKE/GLOB ope
aeb0: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70  rator */.    Exp
aec0: 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20 20 20  r *pStr2;       
aed0: 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74 72 31  /* Copy of pStr1
aee0: 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47   - RHS of LIKE/G
aef0: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  LOB operator */.
af00: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
af10: 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  pr1;.    Expr *p
af20: 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e  NewExpr2;.    in
af30: 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20 20 69  t idxNew1;.    i
af40: 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20 20 20  nt idxNew2;.    
af50: 54 6f 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e 61  Token sCollSeqNa
af60: 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me;  /* Name of 
af70: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
af80: 63 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74  ce */..    pLeft
af90: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
afa0: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
afb0: 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74     pStr2 = sqlit
afc0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
afd0: 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tr1, 0);.    if(
afe0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
aff0: 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63  ed ){.      u8 c
b000: 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20  , *pC;       /* 
b010: 4c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62  Last character b
b020: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
b030: 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20  wildcard */.    
b040: 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74    pC = (u8*)&pSt
b050: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c  r2->u.zToken[sql
b060: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74  ite3Strlen30(pSt
b070: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d  r2->u.zToken)-1]
b080: 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b  ;.      c = *pC;
b090: 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73  .      if( noCas
b0a0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
b0b0: 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20  The point is to 
b0c0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61  increment the la
b0d0: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
b0e0: 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20 20  ore the first.  
b0f0: 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72        ** wildcar
b100: 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 69 6e  d.  But if we in
b110: 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61  crement '@', tha
b120: 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69  t will push it i
b130: 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
b140: 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72 61  ** alphabetic ra
b150: 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 20 63  nge where case c
b160: 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20  onversions will 
b170: 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 20 20  mess up the .   
b180: 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69       ** inequali
b190: 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68  ty.  To avoid th
b1a0: 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f  is, make sure to
b1b0: 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75   also run the fu
b1c0: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49  ll.        ** LI
b1d0: 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64  KE on all candid
b1e0: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ate expressions 
b1f0: 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  by clearing the 
b200: 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a  isComplete flag.
b210: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
b220: 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20     if( c=='A'-1 
b230: 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30  ) isComplete = 0
b240: 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71  ;.        c = sq
b250: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
b260: 72 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r[c];.      }.  
b270: 20 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b      *pC = c + 1;
b280: 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 6f 6c 6c  .    }.    sColl
b290: 53 65 71 4e 61 6d 65 2e 7a 20 3d 20 6e 6f 43 61  SeqName.z = noCa
b2a0: 73 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20  se ? "NOCASE" : 
b2b0: 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 73 43  "BINARY";.    sC
b2c0: 6f 6c 6c 53 65 71 4e 61 6d 65 2e 6e 20 3d 20 36  ollSeqName.n = 6
b2d0: 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20  ;.    pNewExpr1 
b2e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
b2f0: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a  (db, pLeft, 0);.
b300: 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20      pNewExpr1 = 
b310: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
b320: 72 73 65 2c 20 54 4b 5f 47 45 2c 20 0a 20 20 20  rse, TK_GE, .   
b330: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b340: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
b350: 65 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78  en(pParse,pNewEx
b360: 70 72 31 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d  pr1,&sCollSeqNam
b370: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  e),.           p
b380: 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 74 72  Str1, 0);.    tr
b390: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e  ansferJoinMarkin
b3a0: 67 73 28 70 4e 65 77 45 78 70 72 31 2c 20 70 45  gs(pNewExpr1, pE
b3b0: 78 70 72 29 3b 0a 20 20 20 20 69 64 78 4e 65 77  xpr);.    idxNew
b3c0: 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  1 = whereClauseI
b3d0: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
b3e0: 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55  xpr1, TERM_VIRTU
b3f0: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
b400: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
b410: 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20  idxNew1==0 );.  
b420: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
b430: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31  rc, pWC, idxNew1
b440: 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32  );.    pNewExpr2
b450: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b460: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
b470: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d  .    pNewExpr2 =
b480: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
b490: 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20  arse, TK_LT,.   
b4a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b4b0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
b4c0: 65 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78  en(pParse,pNewEx
b4d0: 70 72 32 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d  pr2,&sCollSeqNam
b4e0: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  e),.           p
b4f0: 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 74 72  Str2, 0);.    tr
b500: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e  ansferJoinMarkin
b510: 67 73 28 70 4e 65 77 45 78 70 72 32 2c 20 70 45  gs(pNewExpr2, pE
b520: 78 70 72 29 3b 0a 20 20 20 20 69 64 78 4e 65 77  xpr);.    idxNew
b530: 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  2 = whereClauseI
b540: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
b550: 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55  xpr2, TERM_VIRTU
b560: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
b570: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
b580: 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20  idxNew2==0 );.  
b590: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
b5a0: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 32  rc, pWC, idxNew2
b5b0: 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  );.    pTerm = &
b5c0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
b5d0: 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c  .    if( isCompl
b5e0: 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70 57 43  ete ){.      pWC
b5f0: 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61  ->a[idxNew1].iPa
b600: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
b610: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
b620: 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20  New2].iParent = 
b630: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
b640: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32  Term->nChild = 2
b650: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
b660: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
b670: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
b680: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ION */..#ifndef 
b690: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
b6a0: 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64  UALTABLE.  /* Ad
b6b0: 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61 75 78  d a WO_MATCH aux
b6c0: 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f 20 74  iliary term to t
b6d0: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 65  he constraint se
b6e0: 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75  t if the.  ** cu
b6f0: 72 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  rrent expression
b700: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
b710: 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65    column MATCH e
b720: 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69  xpr..  ** This i
b730: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
b740: 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
b750: 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a  ndex methods of.
b760: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62    ** virtual tab
b770: 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69 76 65  les.  The native
b780: 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72   query optimizer
b790: 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d 70   does not attemp
b7a0: 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79  t.  ** to do any
b7b0: 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54 43 48  thing with MATCH
b7c0: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
b7d0: 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68 4f 66  .  if( isMatchOf
b7e0: 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20 29 7b  Column(pExpr) ){
b7f0: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b  .    int idxNew;
b800: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
b810: 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57  t, *pLeft;.    W
b820: 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65  hereTerm *pNewTe
b830: 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20  rm;.    Bitmask 
b840: 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72  prereqColumn, pr
b850: 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20 20 70  ereqExpr;..    p
b860: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
b870: 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
b880: 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20  pr;.    pLeft = 
b890: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
b8a0: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
b8b0: 70 72 65 72 65 71 45 78 70 72 20 3d 20 65 78 70  prereqExpr = exp
b8c0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
b8d0: 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  kSet, pRight);. 
b8e0: 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20     prereqColumn 
b8f0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
b900: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74  (pMaskSet, pLeft
b910: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72  );.    if( (prer
b920: 65 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43  eqExpr & prereqC
b930: 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  olumn)==0 ){.   
b940: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
b950: 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70  r;.      pNewExp
b960: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
b970: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43  (pParse, TK_MATC
b980: 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  H, .            
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9a0: 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72    0, sqlite3Expr
b9b0: 44 75 70 28 64 62 2c 20 70 52 69 67 68 74 2c 20  Dup(db, pRight, 
b9c0: 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  0), 0);.      id
b9d0: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
b9e0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
b9f0: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
ba00: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
ba10: 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  C);.      testca
ba20: 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b  se( idxNew==0 );
ba30: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20  .      pNewTerm 
ba40: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
ba50: 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ];.      pNewTer
ba60: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
ba70: 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20 20 20   prereqExpr;.   
ba80: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66     pNewTerm->lef
ba90: 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d  tCursor = pLeft-
baa0: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
bab0: 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  NewTerm->u.leftC
bac0: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
bad0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e  Column;.      pN
bae0: 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  ewTerm->eOperato
baf0: 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20  r = WO_MATCH;.  
bb00: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50      pNewTerm->iP
bb10: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
bb20: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
bb30: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
bb40: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
bb50: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
bb60: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
bb70: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
bb80: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
bb90: 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d  rereqAll = pTerm
bba0: 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  ->prereqAll;.   
bbb0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
bbc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
bbd0: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
bbe0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
bbf0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
bc00: 34 0a 20 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69  4.  /* When sqli
bc10: 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72  te_stat3 histogr
bc20: 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  am data is avail
bc30: 61 62 6c 65 20 61 6e 20 6f 70 65 72 61 74 6f 72  able an operator
bc40: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72   of the.  ** for
bc50: 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  m "x IS NOT NULL
bc60: 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20  " can sometimes 
bc70: 62 65 20 65 76 61 6c 75 61 74 65 64 20 6d 6f 72  be evaluated mor
bc80: 65 20 65 66 66 69 63 69 65 6e 74 6c 79 0a 20 20  e efficiently.  
bc90: 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69  ** as "x>NULL" i
bca0: 66 20 78 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  f x is not an IN
bcb0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
bcc0: 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72 75 63 74  Y.  So construct
bcd0: 20 61 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20   a.  ** virtual 
bce0: 74 65 72 6d 20 6f 66 20 74 68 61 74 20 66 6f 72  term of that for
bcf0: 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  m..  **.  ** Not
bd00: 65 20 74 68 61 74 20 74 68 65 20 76 69 72 74 75  e that the virtu
bd10: 61 6c 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  al term must be 
bd20: 74 61 67 67 65 64 20 77 69 74 68 20 54 45 52 4d  tagged with TERM
bd30: 5f 56 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 20 20  _VNULL.  This.  
bd40: 2a 2a 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 74 61  ** TERM_VNULL ta
bd50: 67 20 77 69 6c 6c 20 73 75 70 70 72 65 73 73 20  g will suppress 
bd60: 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65  the not-null che
bd70: 63 6b 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ck at the beginn
bd80: 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ing.  ** of the 
bd90: 6c 6f 6f 70 2e 20 20 57 69 74 68 6f 75 74 20 74  loop.  Without t
bda0: 68 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c  he TERM_VNULL fl
bdb0: 61 67 2c 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c  ag, the not-null
bdc0: 20 63 68 65 63 6b 20 61 74 0a 20 20 2a 2a 20 74   check at.  ** t
bdd0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
bde0: 6c 6f 6f 70 20 77 69 6c 6c 20 70 72 65 76 65 6e  loop will preven
bdf0: 74 20 61 6e 79 20 72 65 73 75 6c 74 73 20 66 72  t any results fr
be00: 6f 6d 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65  om being returne
be10: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45  d..  */.  if( pE
be20: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  xpr->op==TK_NOTN
be30: 55 4c 4c 0a 20 20 20 26 26 20 70 45 78 70 72 2d  ULL.   && pExpr-
be40: 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  >pLeft->op==TK_C
be50: 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70  OLUMN.   && pExp
be60: 72 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  r->pLeft->iColum
be70: 6e 3e 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d  n>=0.   && Optim
be80: 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
be90: 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33 34  b, SQLITE_Stat34
bea0: 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20  ).  ){.    Expr 
beb0: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 45  *pNewExpr;.    E
bec0: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
bed0: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69  pr->pLeft;.    i
bee0: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 57  nt idxNew;.    W
bef0: 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65  hereTerm *pNewTe
bf00: 72 6d 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78 70  rm;..    pNewExp
bf10: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
bf20: 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a  (pParse, TK_GT,.
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf40: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
bf50: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
bf60: 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20  Left, 0),.      
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 45 78        sqlite3PEx
bf90: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55  pr(pParse, TK_NU
bfa0: 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30 29  LL, 0, 0, 0), 0)
bfb0: 3b 0a 0a 20 20 20 20 69 64 78 4e 65 77 20 3d 20  ;..    idxNew = 
bfc0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
bfd0: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
bfe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
c000: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
c010: 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e  _DYNAMIC|TERM_VN
c020: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 69 64  ULL);.    if( id
c030: 78 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e  xNew ){.      pN
c040: 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  ewTerm = &pWC->a
c050: 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
c060: 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
c070: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20  Right = 0;.     
c080: 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43   pNewTerm->leftC
c090: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
c0a0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65  Table;.      pNe
c0b0: 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  wTerm->u.leftCol
c0c0: 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f  umn = pLeft->iCo
c0d0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77  lumn;.      pNew
c0e0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
c0f0: 3d 20 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20 70  = WO_GT;.      p
c100: 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  NewTerm->iParent
c110: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
c120: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
c130: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
c140: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
c150: 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  = 1;.      pTerm
c160: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
c170: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
c180: 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
c190: 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65  All = pTerm->pre
c1a0: 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  reqAll;.    }.  
c1b0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
c1c0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
c1d0: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 20 20 2f  OR_STAT4 */..  /
c1e0: 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61  * Prevent ON cla
c1f0: 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20 4c  use terms of a L
c200: 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65  EFT JOIN from be
c210: 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69 76  ing used to driv
c220: 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20  e.  ** an index 
c230: 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68  for tables to th
c240: 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f  e left of the jo
c250: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d  in..  */.  pTerm
c260: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c 3d  ->prereqRight |=
c270: 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a   extraRight;.}..
c280: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
c290: 69 6f 6e 20 73 65 61 72 63 68 65 73 20 70 4c 69  ion searches pLi
c2a0: 73 74 20 66 6f 72 20 61 6e 20 65 6e 74 72 79 20  st for an entry 
c2b0: 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65  that matches the
c2c0: 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a   iCol-th column.
c2d0: 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  ** of index pIdx
c2e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20  ..**.** If such 
c2f0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
c300: 20 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65   found, its inde
c310: 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20  x in pList->a[] 
c320: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a  is returned. If.
c330: 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e  ** no expression
c340: 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73   is found, -1 is
c350: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
c360: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64  atic int findInd
c370: 65 78 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a  exCol(.  Parse *
c380: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
c390: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
c3a0: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  e context */.  E
c3b0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c3d0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * Expression lis
c3e0: 74 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  t to search */. 
c3f0: 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20   int iBase,     
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c410: 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74   /* Cursor for t
c420: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
c430: 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49  with pIdx */.  I
c440: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c460: 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68  * Index to match
c470: 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20   column of */.  
c480: 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20  int iCol        
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4a0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  /* Column of ind
c4b0: 65 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29  ex to match */.)
c4c0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  {.  int i;.  con
c4d0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
c4e0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43   pIdx->azColl[iC
c4f0: 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ol];..  for(i=0;
c500: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
c510: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
c520: 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  *p = sqlite3Expr
c530: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73  SkipCollate(pLis
c540: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
c550: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
c560: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26  K_COLUMN.     &&
c570: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64   p->iColumn==pId
c580: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c  x->aiColumn[iCol
c590: 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61  ].     && p->iTa
c5a0: 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29  ble==iBase.    )
c5b0: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
c5c0: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
c5d0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
c5e0: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  se, pList->a[i].
c5f0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
c600: 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20  ( ALWAYS(pColl) 
c610: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
c620: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
c630: 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
c640: 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20       return i;. 
c650: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c660: 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ..  return -1;.}
c670: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
c680: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
c690: 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c  NCT expression-l
c6a0: 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
c6b0: 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
c6c0: 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74  .** is redundant
c6d0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e  ..**.** A DISTIN
c6e0: 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e  CT list is redun
c6f0: 64 61 6e 74 20 69 66 20 74 68 65 20 64 61 74 61  dant if the data
c700: 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f  base contains so
c710: 6d 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20  me subset of.** 
c720: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65  columns that are
c730: 20 75 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e 2d   unique and non-
c740: 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  null..*/.static 
c750: 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52 65  int isDistinctRe
c760: 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65  dundant(.  Parse
c770: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
c780: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
c790: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
c7a0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
c7b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52         /* The FR
c7c0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
c7d0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
c7e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c7f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
c800: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73    ExprList *pDis
c810: 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20 54  tinct       /* T
c820: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 68  he result set th
c830: 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 44  at needs to be D
c840: 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20  ISTINCT */.){.  
c850: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
c860: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
c870: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
c890: 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f   int iBase;..  /
c8a0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f  * If there is mo
c8b0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c  re than one tabl
c8c0: 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20  e or sub-select 
c8d0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
c8e0: 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  se of.  ** this 
c8f0: 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77  query, then it w
c900: 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
c910: 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74  ble to show that
c920: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20   the DISTINCT . 
c930: 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65   ** clause is re
c940: 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  dundant. */.  if
c950: 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
c960: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
c970: 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69    iBase = pTabLi
c980: 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
c990: 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c  ;.  pTab = pTabL
c9a0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  ist->a[0].pTab;.
c9b0: 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  /* If any of 
c9c0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
c9d0: 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e  is an IPK column
c9e0: 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c   on table iBase,
c9f0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20   then return .  
ca00: 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54  ** true. Note: T
ca10: 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69  he (p->iTable==i
ca20: 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74 68  Base) part of th
ca30: 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20 66  is test may be f
ca40: 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a  alse if the.  **
ca50: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
ca60: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
ca70: 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  sub-query..  */.
ca80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69    for(i=0; i<pDi
ca90: 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69  stinct->nExpr; i
caa0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
cab0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
cac0: 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74 69  ipCollate(pDisti
cad0: 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  nct->a[i].pExpr)
cae0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ;.    if( p->op=
caf0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d  =TK_COLUMN && p-
cb00: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20 26  >iTable==iBase &
cb10: 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  & p->iColumn<0 )
cb20: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
cb30: 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
cb40: 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e  h all indices on
cb50: 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65 63   the table, chec
cb60: 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65 65  king each to see
cb70: 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a   if it makes.  *
cb80: 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71  * the DISTINCT q
cb90: 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64 61  ualifier redunda
cba0: 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20 69  nt. It does so i
cbb0: 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  f:.  **.  **   1
cbc0: 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 69  . The index is i
cbd0: 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e  tself UNIQUE, an
cbe0: 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e  d.  **.  **   2.
cbf0: 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75   All of the colu
cc00: 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
cc10: 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72 74   are either part
cc20: 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e 63   of the pDistinc
cc30: 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73 74  t.  **      list
cc40: 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57 48  , or else the WH
cc50: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
cc60: 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68  ins a term of th
cc70: 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a  e form "col=X",.
cc80: 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65 20    **      where 
cc90: 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  X is a constant 
cca0: 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61  value. The colla
ccb0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f  tion sequences o
ccc0: 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20  f the.  **      
ccd0: 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 73  comparison and s
cce0: 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72 65  elect-list expre
ccf0: 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63  ssions must matc
cd00: 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20 69  h those of the i
cd10: 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
cd20: 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73    3. All of thos
cd30: 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  e index columns 
cd40: 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57 48  for which the WH
cd50: 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ERE clause does 
cd60: 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f  not.  **      co
cd70: 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20  ntain a "col=X" 
cd80: 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63 74  term are subject
cd90: 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63   to a NOT NULL c
cda0: 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a  onstraint..  */.
cdb0: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
cdc0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
cdd0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
cde0: 7b 0a 20 20 20 20 69 66 28 20 21 49 73 55 6e 69  {.    if( !IsUni
cdf0: 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29  queIndex(pIdx) )
ce00: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
ce10: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
ce20: 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nKeyCol; i++){. 
ce30: 20 20 20 20 20 69 31 36 20 69 43 6f 6c 20 3d 20       i16 iCol = 
ce40: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
ce50: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ];.      if( 0==
ce60: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42  findTerm(pWC, iB
ce70: 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74  ase, iCol, ~(Bit
ce80: 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70  mask)0, WO_EQ, p
ce90: 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
cea0: 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20 66 69  int iIdxCol = fi
ceb0: 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72 73  ndIndexCol(pPars
cec0: 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69 42  e, pDistinct, iB
ced0: 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20  ase, pIdx, i);. 
cee0: 20 20 20 20 20 20 20 69 66 28 20 69 49 64 78 43         if( iIdxC
cef0: 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e 61 43  ol<0 || pTab->aC
cf00: 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c  ol[iCol].notNull
cf10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
cf20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
cf30: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
cf40: 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d      if( i==pIdx-
cf50: 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20  >nKeyCol ){.    
cf60: 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
cf70: 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65  implies that the
cf80: 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
cf90: 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74  ier is redundant
cfa0: 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
cfb0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 1;.    }.  }..
cfc0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
cfd0: 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
cfe0: 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20  he logarithm of 
cff0: 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 20  the input value 
d000: 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74  to base 2..*/.st
d010: 61 74 69 63 20 4c 6f 67 45 73 74 20 65 73 74 4c  atic LogEst estL
d020: 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a 20 20  og(LogEst N){.  
d030: 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20 3f 20 30  return N<=10 ? 0
d040: 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   : sqlite3LogEst
d050: 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a  (N) - 33;.}../*.
d060: 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20  ** Two routines 
d070: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65  for printing the
d080: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73   content of an s
d090: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
d0a0: 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  o.** structure. 
d0b0: 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
d0c0: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
d0d0: 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65  only.  If neithe
d0e0: 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  r.** SQLITE_TEST
d0f0: 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47   or SQLITE_DEBUG
d100: 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68   are defined, th
d110: 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  en these routine
d120: 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  s.** are no-ops.
d130: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
d140: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
d150: 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
d160: 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
d170: 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63  _ENABLED).static
d180: 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
d190: 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  INPUTS(sqlite3_i
d1a0: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
d1b0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
d1c0: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
d1d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
d1e0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
d1f0: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
d200: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
d210: 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69  intf("  constrai
d220: 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74  nt[%d]: col=%d t
d230: 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75  ermid=%d op=%d u
d240: 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20  sabled=%d\n",.  
d250: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
d260: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
d270: 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
d280: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
d290: 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a  i].iTermOffset,.
d2a0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
d2b0: 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20  raint[i].op,.   
d2c0: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
d2d0: 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20  nt[i].usable);. 
d2e0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
d2f0: 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b  p->nOrderBy; i++
d300: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
d310: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
d320: 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  erby[%d]: col=%d
d330: 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20   desc=%d\n",.   
d340: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
d350: 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f  >aOrderBy[i].iCo
d360: 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
d370: 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  aOrderBy[i].desc
d380: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
d390: 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f  void TRACE_IDX_O
d3a0: 55 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  UTPUTS(sqlite3_i
d3b0: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
d3c0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
d3d0: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
d3e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
d3f0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
d400: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
d410: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
d420: 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25 64  intf("  usage[%d
d430: 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d  ]: argvIdx=%d om
d440: 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  it=%d\n",.      
d450: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
d460: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
d470: 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20  ].argvIndex,.   
d480: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
d490: 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29  ntUsage[i].omit)
d4a0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
d4b0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
d4c0: 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69  xNum=%d\n", p->i
d4d0: 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65  dxNum);.  sqlite
d4e0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
d4f0: 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d  idxStr=%s\n", p-
d500: 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
d510: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
d520: 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65    orderByConsume
d530: 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65  d=%d\n", p->orde
d540: 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20  rByConsumed);.  
d550: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
d560: 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 43  tf("  estimatedC
d570: 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73  ost=%g\n", p->es
d580: 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20  timatedCost);.  
d590: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
d5a0: 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 52  tf("  estimatedR
d5b0: 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e  ows=%lld\n", p->
d5c0: 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a  estimatedRows);.
d5d0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
d5e0: 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
d5f0: 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  (A).#define TRAC
d600: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29  E_IDX_OUTPUTS(A)
d610: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
d620: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
d630: 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a  OMATIC_INDEX./*.
d640: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
d650: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
d660: 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73  se term pTerm is
d670: 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65   of a form where
d680: 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20   it.** could be 
d690: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
d6a0: 65 78 20 74 6f 20 61 63 63 65 73 73 20 70 53 72  ex to access pSr
d6b0: 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61  c, assuming an a
d6c0: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e  ppropriate.** in
d6d0: 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a  dex existed..*/.
d6e0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43  static int termC
d6f0: 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20  anDriveIndex(.  
d700: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
d710: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
d720: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
d730: 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  erm to check */.
d740: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
d750: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20  _item *pSrc,    
d760: 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65   /* Table we are
d770: 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73   trying to acces
d780: 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  s */.  Bitmask n
d790: 6f 74 52 65 61 64 79 20 20 20 20 20 20 20 20 20  otReady         
d7a0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
d7b0: 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f  in outer loops o
d7c0: 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b  f the join */.){
d7d0: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69  .  char aff;.  i
d7e0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
d7f0: 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72  rsor!=pSrc->iCur
d800: 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  sor ) return 0;.
d810: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
d820: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29  perator & WO_EQ)
d830: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
d840: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
d850: 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52  ereqRight & notR
d860: 65 61 64 79 29 21 3d 30 20 29 20 72 65 74 75 72  eady)!=0 ) retur
d870: 6e 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72 6d  n 0;.  if( pTerm
d880: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c 30  ->u.leftColumn<0
d890: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
d8a0: 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d  ff = pSrc->pTab-
d8b0: 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c  >aCol[pTerm->u.l
d8c0: 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  eftColumn].affin
d8d0: 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  ity;.  if( !sqli
d8e0: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
d8f0: 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  Ok(pTerm->pExpr,
d900: 20 61 66 66 29 20 29 20 72 65 74 75 72 6e 20 30   aff) ) return 0
d910: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
d920: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66  #endif...#ifndef
d930: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
d940: 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a  OMATIC_INDEX./*.
d950: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
d960: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68   to construct th
d970: 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66  e Index object f
d980: 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  or an automatic 
d990: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20  index.** and to 
d9a0: 73 65 74 20 75 70 20 74 68 65 20 57 68 65 72 65  set up the Where
d9b0: 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65  Level object pLe
d9c0: 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20  vel so that the 
d9d0: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a  code generator.*
d9e0: 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74  * makes use of t
d9f0: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
da00: 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
da10: 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f  id constructAuto
da20: 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61  maticIndex(.  Pa
da30: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
da40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
da50: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
da60: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
da70: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
da80: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
da90: 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
daa0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
dab0: 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52  pSrc,  /* The FR
dac0: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
dad0: 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74 20 69  o get the next i
dae0: 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73  ndex */.  Bitmas
daf0: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
db00: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
db10: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
db20: 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  e not available 
db30: 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
db40: 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20  *pLevel         
db50: 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e   /* Write new in
db60: 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  dex here */.){. 
db70: 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20   int nKeyCol;   
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db90: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
dba0: 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75  s in the constru
dbb0: 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cted index */.  
dbc0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
dbd0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
dbe0: 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
dbf0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
dc00: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
dc10: 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20  *pWCEnd;        
dc20: 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d    /* End of pWC-
dc30: 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20  >a[] */.  Index 
dc40: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
dc50: 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
dc60: 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 74  describing the t
dc70: 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a  ransient index *
dc80: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dca0: 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74  /* Prepared stat
dcb0: 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
dcc0: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
dcd0: 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20  t addrInit;     
dce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
dcf0: 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74  ress of the init
dd00: 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73  ialization bypas
dd10: 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c  s jump */.  Tabl
dd20: 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20  e *pTable;      
dd30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
dd40: 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78  able being index
dd50: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
dd60: 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
dd70: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
dd80: 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f  e index fill loo
dd90: 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  p */.  int regRe
dda0: 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20  cord;           
ddb0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
ddc0: 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  olding an index 
ddd0: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
dde0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
ddf0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
de00: 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  n counter */.  i
de10: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
de20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
de30: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
de40: 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20  int mxBitCol;   
de50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
de60: 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e  aximum column in
de70: 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a   pSrc->colUsed *
de80: 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  /.  CollSeq *pCo
de90: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
dea0: 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
deb0: 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f  uence to on a co
dec0: 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c  lumn */.  WhereL
ded0: 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
dee0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f        /* The Loo
def0: 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  p object */.  ch
df00: 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20  ar *zNotUsed;   
df10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
df20: 72 61 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ra space on the 
df30: 65 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20  end of pIdx */. 
df40: 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73   Bitmask idxCols
df50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
df60: 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e  Bitmap of column
df70: 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78  s used for index
df80: 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ing */.  Bitmask
df90: 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20   extraCols;     
dfa0: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f       /* Bitmap o
dfb0: 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  f additional col
dfc0: 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e  umns */.  u8 sen
dfd0: 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20  tWarning = 0;   
dfe0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
dff0: 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20   a warnning has 
e000: 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 0a  been issued */..
e010: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
e020: 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20  de to skip over 
e030: 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64  the creation and
e040: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
e050: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e  of the.  ** tran
e060: 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32  sient index on 2
e070: 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
e080: 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20  t iterations of 
e090: 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76  the loop. */.  v
e0a0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
e0b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
e0c0: 20 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d   );.  addrInit =
e0d0: 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
e0e0: 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f  (pParse); VdbeCo
e0f0: 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
e100: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
e110: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  r of columns tha
e120: 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  t will be added 
e130: 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  to the index.  *
e140: 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61  * and used to ma
e150: 74 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65  tch WHERE clause
e160: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
e170: 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20    nKeyCol = 0;. 
e180: 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e   pTable = pSrc->
e190: 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d  pTab;.  pWCEnd =
e1a0: 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54   &pWC->a[pWC->nT
e1b0: 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  erm];.  pLoop = 
e1c0: 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
e1d0: 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20    idxCols = 0;. 
e1e0: 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
e1f0: 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
e200: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
e210: 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
e220: 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
e230: 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
e240: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
e250: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
e260: 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
e270: 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
e280: 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42  =BMS ? MASKBIT(B
e290: 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28  MS-1) : MASKBIT(
e2a0: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73  iCol);.      tes
e2b0: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
e2c0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
e2d0: 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20  se( iCol==BMS-1 
e2e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 65  );.      if( !se
e2f0: 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20  ntWarning ){.   
e300: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
e310: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f  (SQLITE_WARNING_
e320: 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20  AUTOINDEX,.     
e330: 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69         "automati
e340: 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73  c index on %s(%s
e350: 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  )", pTable->zNam
e360: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e,.            p
e370: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
e380: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
e390: 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20    sentWarning = 
e3a0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
e3b0: 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20   if( (idxCols & 
e3c0: 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  cMask)==0 ){.   
e3d0: 20 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f       if( whereLo
e3e0: 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d  opResize(pParse-
e3f0: 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79  >db, pLoop, nKey
e400: 43 6f 6c 2b 31 29 20 29 20 72 65 74 75 72 6e 3b  Col+1) ) return;
e410: 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
e420: 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b  aLTerm[nKeyCol++
e430: 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
e440: 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d     idxCols |= cM
e450: 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
e460: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
e470: 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20 20   nKeyCol>0 );.  
e480: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
e490: 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  Eq = pLoop->nLTe
e4a0: 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20  rm = nKeyCol;.  
e4b0: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
e4c0: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
e4d0: 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   | WHERE_IDX_ONL
e4e0: 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45  Y | WHERE_INDEXE
e4f0: 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D.              
e500: 20 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41         | WHERE_A
e510: 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a  UTO_INDEX;..  /*
e520: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
e530: 72 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20  r of additional 
e540: 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74  columns needed t
e550: 6f 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20  o create a.  ** 
e560: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20  covering index. 
e570: 20 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64   A "covering ind
e580: 65 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ex" is an index 
e590: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c  that contains al
e5a0: 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74  l.  ** columns t
e5b0: 68 61 74 20 61 72 65 20 6e 65 65 64 65 64 20 62  hat are needed b
e5c0: 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 57 69  y the query.  Wi
e5d0: 74 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  th a covering in
e5e0: 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72  dex, the.  ** or
e5f0: 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76  iginal table nev
e600: 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  er needs to be a
e610: 63 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61  ccessed.  Automa
e620: 74 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74  tic indices must
e630: 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72  .  ** be a cover
e640: 69 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75 73  ing index becaus
e650: 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c  e the index will
e660: 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 20   not be updated 
e670: 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  if the.  ** orig
e680: 69 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67  inal table chang
e690: 65 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  es and the index
e6a0: 20 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f   and table canno
e6b0: 74 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20  t both be used. 
e6c0: 20 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f   ** if they go o
e6d0: 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f  ut of sync..  */
e6e0: 0a 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70  .  extraCols = p
e6f0: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28  Src->colUsed & (
e700: 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42  ~idxCols | MASKB
e710: 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78  IT(BMS-1));.  mx
e720: 42 69 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65  BitCol = (pTable
e730: 2d 3e 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29  ->nCol >= BMS-1)
e740: 20 3f 20 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c   ? BMS-1 : pTabl
e750: 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63  e->nCol;.  testc
e760: 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ase( pTable->nCo
e770: 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65  l==BMS-1 );.  te
e780: 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
e790: 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  nCol==BMS-2 );. 
e7a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69   for(i=0; i<mxBi
e7b0: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
e7c0: 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20  if( extraCols & 
e7d0: 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b 65  MASKBIT(i) ) nKe
e7e0: 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  yCol++;.  }.  if
e7f0: 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
e800: 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  & MASKBIT(BMS-1)
e810: 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20   ){.    nKeyCol 
e820: 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  += pTable->nCol 
e830: 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20  - BMS + 1;.  }. 
e840: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
e850: 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
e860: 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f  EQ | WHERE_IDX_O
e870: 4e 4c 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74  NLY;..  /* Const
e880: 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f  ruct the Index o
e890: 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69 62  bject to describ
e8a0: 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a  e this index */.
e8b0: 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33    pIdx = sqlite3
e8c0: 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a  AllocateIndexObj
e8d0: 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ect(pParse->db, 
e8e0: 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a  nKeyCol+1, 0, &z
e8f0: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
e900: 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  pIdx==0 ) return
e910: 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ;.  pLoop->u.btr
e920: 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
e930: 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  ;.  pIdx->zName 
e940: 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a  = "auto-index";.
e950: 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d    pIdx->pTable =
e960: 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30   pTable;.  n = 0
e970: 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
e980: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
e990: 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
e9a0: 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
e9b0: 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
e9c0: 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
e9d0: 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
e9e0: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
e9f0: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
ea00: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74  olumn;.      Bit
ea10: 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f  mask cMask = iCo
ea20: 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54  l>=BMS ? MASKBIT
ea30: 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49  (BMS-1) : MASKBI
ea40: 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74  T(iCol);.      t
ea50: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
ea60: 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  MS-1 );.      te
ea70: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
ea80: 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  S );.      if( (
ea90: 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
eaa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
eab0: 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
eac0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
ead0: 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b  idxCols |= cMask
eae0: 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
eaf0: 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54  aiColumn[n] = pT
eb00: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
eb10: 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  n;.        pColl
eb20: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
eb30: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
eb40: 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
eb50: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
eb60: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
eb70: 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28  oll[n] = ALWAYS(
eb80: 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e  pColl) ? pColl->
eb90: 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22  zName : "BINARY"
eba0: 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  ;.        n++;. 
ebb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ebc0: 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29  .  assert( (u32)
ebd0: 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  n==pLoop->u.btre
ebe0: 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41  e.nEq );..  /* A
ebf0: 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  dd additional co
ec00: 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
ec10: 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74  make the automat
ec20: 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20  ic index into.  
ec30: 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  ** a covering in
ec40: 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  dex */.  for(i=0
ec50: 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
ec60: 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
ec70: 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28  aCols & MASKBIT(
ec80: 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i) ){.      pIdx
ec90: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
eca0: 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
ecb0: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
ecc0: 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  RY";.      n++;.
ecd0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ece0: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
ecf0: 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29  MASKBIT(BMS-1) )
ed00: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d  {.    for(i=BMS-
ed10: 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  1; i<pTable->nCo
ed20: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
ed30: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
ed40: 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
ed50: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42  ->azColl[n] = "B
ed60: 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b  INARY";.      n+
ed70: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  +;.    }.  }.  a
ed80: 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f  ssert( n==nKeyCo
ed90: 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43  l );.  pIdx->aiC
eda0: 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b 0a 20  olumn[n] = -1;. 
edb0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
edc0: 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20   = "BINARY";..  
edd0: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75  /* Create the au
ede0: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f  tomatic index */
edf0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65  .  assert( pLeve
ee00: 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b  l->iIdxCur>=0 );
ee10: 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  .  pLevel->iIdxC
ee20: 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
ee30: 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  b++;.  sqlite3Vd
ee40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
ee50: 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c  penAutoindex, pL
ee60: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e  evel->iIdxCur, n
ee70: 4b 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c  KeyCol+1);.  sql
ee80: 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
ee90: 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
eea0: 78 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  x);.  VdbeCommen
eeb0: 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20  t((v, "for %s", 
eec0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b  pTable->zName));
eed0: 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20  ..  /* Fill the 
eee0: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
eef0: 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  with content */.
ef00: 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
ef10: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
ef20: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76   OP_Rewind, pLev
ef30: 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 20 56 64  el->iTabCur); Vd
ef40: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
ef50: 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
ef60: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
ef70: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
ef80: 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
ef90: 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20  y(pParse, pIdx, 
efa0: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
efb0: 20 72 65 67 52 65 63 6f 72 64 2c 20 30 2c 20 30   regRecord, 0, 0
efc0: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
efd0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
efe0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c  OP_IdxInsert, pL
eff0: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72  evel->iIdxCur, r
f000: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
f010: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
f020: 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
f030: 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
f040: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f050: 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65  , OP_Next, pLeve
f060: 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72  l->iTabCur, addr
f070: 54 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65  Top+1); VdbeCove
f080: 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
f090: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
f0a0: 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
f0b0: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a  TUS_AUTOINDEX);.
f0c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
f0d0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
f0e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
f0f0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
f100: 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
f110: 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65   .  /* Jump here
f120: 20 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74   when skipping t
f130: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
f140: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  n */.  sqlite3Vd
f150: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
f160: 64 72 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69  drInit);.}.#endi
f170: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
f180: 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
f190: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
f1a0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
f1b0: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  TABLE./*.** Allo
f1c0: 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  cate and populat
f1d0: 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  e an sqlite3_ind
f1e0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
f1f0: 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  e. It is the .**
f200: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
f210: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
f220: 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
f230: 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ase the structur
f240: 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20  e.** by passing 
f250: 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  the pointer retu
f260: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
f270: 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33  ction to sqlite3
f280: 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
f290: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ic sqlite3_index
f2a0: 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49  _info *allocateI
f2b0: 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73  ndexInfo(.  Pars
f2c0: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65  e *pParse,.  Whe
f2d0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
f2e0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
f2f0: 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78  item *pSrc,.  Ex
f300: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
f310: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
f320: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73    int nTerm;.  s
f330: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
f340: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
f350: 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
f360: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
f370: 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72  _orderby *pIdxOr
f380: 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20  derBy;.  struct 
f390: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
f3a0: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
f3b0: 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54  pUsage;.  WhereT
f3c0: 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
f3d0: 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71  t nOrderBy;.  sq
f3e0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
f3f0: 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f   *pIdxInfo;..  /
f400: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
f410: 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57  er of possible W
f420: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
f430: 74 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e  traints referrin
f440: 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76  g.  ** to this v
f450: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
f460: 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c    for(i=nTerm=0,
f470: 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
f480: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
f490: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
f4a0: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
f4b0: 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
f4c0: 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
f4d0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
f4e0: 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
f4f0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
f500: 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
f510: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
f520: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
f530: 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
f540: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
f550: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
f560: 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
f570: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
f580: 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a  tor & WO_ALL );.
f590: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
f5a0: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f  eOperator & ~(WO
f5b0: 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56  _ISNULL|WO_EQUIV
f5c0: 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ))==0 ) continue
f5d0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
f5e0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
f5f0: 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  VNULL ) continue
f600: 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20  ;.    nTerm++;. 
f610: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
f620: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
f630: 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f  contains only co
f640: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72  lumns in the cur
f650: 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75  rent .  ** virtu
f660: 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c  al table then al
f670: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
f680: 20 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61   the aOrderBy pa
f690: 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73  rt of.  ** the s
f6a0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
f6b0: 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  o structure..  *
f6c0: 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30  /.  nOrderBy = 0
f6d0: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
f6e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20   ){.    int n = 
f6f0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
f700: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f710: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  n; i++){.      E
f720: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
f730: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
f740: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  r;.      if( pEx
f750: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
f760: 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  N || pExpr->iTab
f770: 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  le!=pSrc->iCurso
f780: 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
f790: 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a  .    if( i==n){.
f7a0: 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d        nOrderBy =
f7b0: 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   n;.    }.  }.. 
f7c0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
f7d0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
f7e0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20  nfo structure.  
f7f0: 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20  */.  pIdxInfo = 
f800: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
f810: 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
f820: 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f  sizeof(*pIdxInfo
f830: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28               + (
f850: 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73  sizeof(*pIdxCons
f860: 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61  ) + sizeof(*pUsa
f870: 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20  ge))*nTerm.     
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a        + sizeof(*
f8a0: 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72  pIdxOrderBy)*nOr
f8b0: 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70  derBy );.  if( p
f8c0: 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  IdxInfo==0 ){.  
f8d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f8e0: 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f  g(pParse, "out o
f8f0: 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20  f memory");.    
f900: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
f910: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
f920: 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  he structure.  T
f930: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
f940: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
f950: 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61  contains.  ** ma
f960: 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74 20 61  ny fields that a
f970: 72 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e  re declared "con
f980: 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78  st" to prevent x
f990: 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20  BestIndex from. 
f9a0: 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65   ** changing the
f9b0: 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64  m.  We have to d
f9c0: 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73  o some funky cas
f9d0: 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f  ting in order to
f9e0: 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  .  ** initialize
f9f0: 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20   those fields.. 
fa00: 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d   */.  pIdxCons =
fa10: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
fa20: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
fa30: 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b  t*)&pIdxInfo[1];
fa40: 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d  .  pIdxOrderBy =
fa50: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
fa60: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29  _index_orderby*)
fa70: 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d  &pIdxCons[nTerm]
fa80: 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74  ;.  pUsage = (st
fa90: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
faa0: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
fab0: 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42  age*)&pIdxOrderB
fac0: 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a  y[nOrderBy];.  *
fad0: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
fae0: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e  >nConstraint = n
faf0: 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26  Term;.  *(int*)&
fb00: 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
fb10: 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  By = nOrderBy;. 
fb20: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
fb30: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
fb40: 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
fb50: 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  aConstraint = pI
fb60: 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75  dxCons;.  *(stru
fb70: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
fb80: 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78  _orderby**)&pIdx
fb90: 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d  Info->aOrderBy =
fba0: 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20   pIdxOrderBy;.  
fbb0: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
fbc0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
fbd0: 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49  t_usage**)&pIdxI
fbe0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
fbf0: 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20  Usage =.        
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc30: 20 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67             pUsag
fc40: 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c  e;..  for(i=j=0,
fc50: 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
fc60: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
fc70: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
fc80: 75 38 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  u8 op;.    if( p
fc90: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
fca0: 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f   != pSrc->iCurso
fcb0: 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
fcc0: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
fcd0: 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
fce0: 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
fcf0: 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
fd00: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
fd10: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
fd20: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
fd30: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
fd40: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
fd50: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
fd60: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
fd70: 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69   WO_ALL );.    i
fd80: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
fd90: 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55  ator & ~(WO_ISNU
fda0: 4c 4c 7c 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30  LL|WO_EQUIV))==0
fdb0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
fdc0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
fdd0: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
fde0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
fdf0: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f   pIdxCons[j].iCo
fe00: 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  lumn = pTerm->u.
fe10: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
fe20: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72  pIdxCons[j].iTer
fe30: 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20  mOffset = i;.   
fe40: 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d   op = (u8)pTerm-
fe50: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
fe60: 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  ALL;.    if( op=
fe70: 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f  =WO_IN ) op = WO
fe80: 5f 45 51 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  _EQ;.    pIdxCon
fe90: 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20  s[j].op = op;.  
fea0: 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20    /* The direct 
feb0: 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68  assignment in th
fec0: 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20  e previous line 
fed0: 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79  is possible only
fee0: 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   because.    ** 
fef0: 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49  the WO_ and SQLI
ff00: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
ff10: 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69  INT_ codes are i
ff20: 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20  dentical.  The. 
ff30: 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
ff40: 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20 74  asserts verify t
ff50: 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20  his fact. */.   
ff60: 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d   assert( WO_EQ==
ff70: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
ff80: 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20  STRAINT_EQ );.  
ff90: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d    assert( WO_LT=
ffa0: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
ffb0: 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20  NSTRAINT_LT );. 
ffc0: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45     assert( WO_LE
ffd0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
ffe0: 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a  ONSTRAINT_LE );.
fff0: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
10000 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  T==SQLITE_INDEX_
10010 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b  CONSTRAINT_GT );
10020 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
10030 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GE==SQLITE_INDEX
10040 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29  _CONSTRAINT_GE )
10050 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
10060 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49  _MATCH==SQLITE_I
10070 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
10080 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73  MATCH );.    ass
10090 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
100a0 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57  rator & (WO_IN|W
100b0 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_EQ|WO_LT|WO_LE
100c0 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
100d0 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b  MATCH) );.    j+
100e0 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  +;.  }.  for(i=0
100f0 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
10100 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
10110 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
10120 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
10130 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69  pIdxOrderBy[i].i
10140 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
10150 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  iColumn;.    pId
10160 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  xOrderBy[i].desc
10170 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
10180 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  ].sortOrder;.  }
10190 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49  ..  return pIdxI
101a0 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nfo;.}../*.** Th
101b0 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72  e table object r
101c0 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20  eference passed 
101d0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
101e0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
101f0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
10200 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74  represent a virt
10210 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ual table. This 
10220 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73  function invokes
10230 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28   the xBestIndex(
10240 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74  ).** method of t
10250 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
10260 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65   with the sqlite
10270 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a  3_index_info obj
10280 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65  ect that.** come
10290 73 20 69 6e 20 61 73 20 74 68 65 20 33 72 64 20  s in as the 3rd 
102a0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
102b0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
102c0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
102d0 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20 70  urs, pParse is p
102e0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
102f0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
10300 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  nd a.** non-zero
10310 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
10320 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
10330 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
10340 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70   the output.** p
10350 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74  art of the sqlit
10360 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
10370 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74 20  ructure is left 
10380 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  populated..**.**
10390 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
103a0 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
103b0 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65 20  rned, it is the 
103c0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
103d0 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
103e0 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
103f0 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20  ee p->idxStr if 
10400 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  p->needToFreeIdx
10410 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  Str indicates.**
10420 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72 65   that this is re
10430 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
10440 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e  c int vtabBestIn
10450 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
10460 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
10470 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
10480 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  fo *p){.  sqlite
10490 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
104a0 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
104b0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
104c0 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74  b)->pVtab;.  int
104d0 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
104e0 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
104f0 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74  S(p);.  rc = pVt
10500 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65  ab->pModule->xBe
10510 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70  stIndex(pVtab, p
10520 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f  );.  TRACE_IDX_O
10530 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66  UTPUTS(p);..  if
10540 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10550 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
10560 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
10570 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
10580 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
10590 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
105a0 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67   !pVtab->zErrMsg
105b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
105c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
105d0 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45  , "%s", sqlite3E
105e0 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20  rrStr(rc));.    
105f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
10600 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
10610 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62  rse, "%s", pVtab
10620 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
10630 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
10640 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72  free(pVtab->zErr
10650 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a  Msg);.  pVtab->z
10660 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66  ErrMsg = 0;..  f
10670 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
10680 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
10690 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e      if( !p->aCon
106a0 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
106b0 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61  e && p->aConstra
106c0 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
106d0 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20  Index>0 ){.     
106e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
106f0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
10700 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78      "table %s: x
10710 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e  BestIndex return
10720 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c  ed an invalid pl
10730 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  an", pTab->zName
10740 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
10750 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
10760 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Err;.}.#endif /*
10770 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
10780 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
10790 4c 45 29 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20  LE) */...#ifdef 
107a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
107b0 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
107c0 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
107d0 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61  location of a pa
107e0 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f  rticular key amo
107f0 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61  ng all keys in a
10800 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f  n.** index.  Sto
10810 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
10820 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f  n aStat as follo
10830 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74  ws:.**.**    aSt
10840 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20  at[0]      Est. 
10850 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c  number of rows l
10860 65 73 73 20 74 68 61 6e 20 70 56 61 6c 0a 2a 2a  ess than pVal.**
10870 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20      aStat[1]    
10880 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
10890 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70   rows equal to p
108a0 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  Val.**.** Return
108b0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
108c0 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccess..*/.static
108d0 20 76 6f 69 64 20 77 68 65 72 65 4b 65 79 53 74   void whereKeySt
108e0 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ats(.  Parse *pP
108f0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
10900 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
10910 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  onnection */.  I
10920 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
10930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
10940 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  dex to consider 
10950 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55  domain of */.  U
10960 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
10970 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56 65  Rec,       /* Ve
10980 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20 74  ctor of values t
10990 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20  o consider */.  
109a0 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20  int roundUp,    
109b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
109c0 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e  ound up if true.
109d0 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20    Round down if 
109e0 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63  false */.  tRowc
109f0 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20 20 20  nt *aStat       
10a00 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73         /* OUT: s
10a10 74 61 74 73 20 77 72 69 74 74 65 6e 20 68 65 72  tats written her
10a20 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53  e */.){.  IndexS
10a30 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d  ample *aSample =
10a40 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a   pIdx->aSample;.
10a50 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a70 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69 72   Index of requir
10a80 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45 71  ed stats in anEq
10a90 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  [] etc. */.  int
10aa0 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20 20 20 20   iMin = 0;      
10ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c           /* Smal
10ac0 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20  lest sample not 
10ad0 79 65 74 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  yet tested */.  
10ae0 69 6e 74 20 69 20 3d 20 70 49 64 78 2d 3e 6e 53  int i = pIdx->nS
10af0 61 6d 70 6c 65 3b 20 20 20 20 20 20 2f 2a 20 53  ample;      /* S
10b00 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c  mallest sample l
10b10 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71  arger than or eq
10b20 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20  ual to pRec */. 
10b30 20 69 6e 74 20 69 54 65 73 74 3b 20 20 20 20 20   int iTest;     
10b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10b50 4e 65 78 74 20 73 61 6d 70 6c 65 20 74 6f 20 74  Next sample to t
10b60 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  est */.  int res
10b70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10b80 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
10b90 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  f comparison ope
10ba0 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64  ration */..#ifnd
10bb0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
10bc0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10bd0 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65  ER( pParse );.#e
10be0 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
10bf0 52 65 63 21 3d 30 20 29 3b 0a 20 20 69 43 6f 6c  Rec!=0 );.  iCol
10c00 20 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20   = pRec->nField 
10c10 2d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  - 1;.  assert( p
10c20 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29  Idx->nSample>0 )
10c30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 63  ;.  assert( pRec
10c40 2d 3e 6e 46 69 65 6c 64 3e 30 20 26 26 20 69 43  ->nField>0 && iC
10c50 6f 6c 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  ol<pIdx->nSample
10c60 43 6f 6c 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  Col );.  do{.   
10c70 20 69 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69   iTest = (iMin+i
10c80 29 2f 32 3b 0a 20 20 20 20 72 65 73 20 3d 20 73  )/2;.    res = s
10c90 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
10ca0 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
10cb0 69 54 65 73 74 5d 2e 6e 2c 20 61 53 61 6d 70 6c  iTest].n, aSampl
10cc0 65 5b 69 54 65 73 74 5d 2e 70 2c 20 70 52 65 63  e[iTest].p, pRec
10cd0 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30  );.    if( res<0
10ce0 20 29 7b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d   ){.      iMin =
10cf0 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65   iTest+1;.    }e
10d00 6c 73 65 7b 0a 20 20 20 20 20 20 69 20 3d 20 69  lse{.      i = i
10d10 54 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  Test;.    }.  }w
10d20 68 69 6c 65 28 20 72 65 73 20 26 26 20 69 4d 69  hile( res && iMi
10d30 6e 3c 69 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  n<i );..#ifdef S
10d40 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
10d50 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
10d60 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73  ssert statements
10d70 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
10d80 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 63 6f  binary search co
10d90 64 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f  de.  ** above fo
10da0 75 6e 64 20 74 68 65 20 72 69 67 68 74 20 61 6e  und the right an
10db0 73 77 65 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b  swer. This block
10dc0 20 73 65 72 76 65 73 20 6e 6f 20 70 75 72 70 6f   serves no purpo
10dd0 73 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68  se other.  ** th
10de0 61 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  an to invoke the
10df0 20 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20   asserts.  */.  
10e00 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
10e10 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29    /* If (res==0)
10e20 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 73   is true, then s
10e30 61 6d 70 6c 65 20 24 69 20 6d 75 73 74 20 62 65  ample $i must be
10e40 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a   equal to pRec *
10e50 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  /.    assert( i<
10e60 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b  pIdx->nSample );
10e70 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d  .    assert( 0==
10e80 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
10e90 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
10ea0 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
10eb0 5d 2e 70 2c 20 70 52 65 63 29 0a 20 20 20 20 20  ].p, pRec).     
10ec0 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64      || pParse->d
10ed0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
10ee0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10ef0 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 70 52  /* Otherwise, pR
10f00 65 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c  ec must be small
10f10 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 24  er than sample $
10f20 69 20 61 6e 64 20 6c 61 72 67 65 72 20 74 68 61  i and larger tha
10f30 6e 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20  n.    ** sample 
10f40 28 24 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20  ($i-1).  */.    
10f50 61 73 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d  assert( i==pIdx-
10f60 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20  >nSample .      
10f70 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62     || sqlite3Vdb
10f80 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
10f90 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61  Sample[i].n, aSa
10fa0 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29  mple[i].p, pRec)
10fb0 3e 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  >0.         || p
10fc0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
10fd0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61  cFailed );.    a
10fe0 73 73 65 72 74 28 20 69 3d 3d 30 0a 20 20 20 20  ssert( i==0.    
10ff0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
11000 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
11010 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c  (aSample[i-1].n,
11020 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c   aSample[i-1].p,
11030 20 70 52 65 63 29 3c 30 0a 20 20 20 20 20 20 20   pRec)<0.       
11040 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
11050 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
11060 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69  .  }.#endif /* i
11070 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
11080 47 20 2a 2f 0a 0a 20 20 2f 2a 20 41 74 20 74 68  G */..  /* At th
11090 69 73 20 70 6f 69 6e 74 2c 20 61 53 61 6d 70 6c  is point, aSampl
110a0 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72 73  e[i] is the firs
110b0 74 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73  t sample that is
110c0 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20   greater than.  
110d0 2a 2a 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70  ** or equal to p
110e0 56 61 6c 2e 20 20 4f 72 20 69 66 20 69 3d 3d 70  Val.  Or if i==p
110f0 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74 68  Idx->nSample, th
11100 65 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 61  en all samples a
11110 72 65 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61  re less.  ** tha
11120 6e 20 70 56 61 6c 2e 20 20 49 66 20 61 53 61 6d  n pVal.  If aSam
11130 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74 68  ple[i]==pVal, th
11140 65 6e 20 72 65 73 3d 3d 30 2e 0a 20 20 2a 2f 0a  en res==0..  */.
11150 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
11160 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61      aStat[0] = a
11170 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69  Sample[i].anLt[i
11180 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b  Col];.    aStat[
11190 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  1] = aSample[i].
111a0 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65  anEq[iCol];.  }e
111b0 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74  lse{.    tRowcnt
111c0 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72 2c   iLower, iUpper,
111d0 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69   iGap;.    if( i
111e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f  ==0 ){.      iLo
111f0 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  wer = 0;.      i
11200 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b  Upper = aSample[
11210 30 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20  0].anLt[iCol];. 
11220 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11230 69 36 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69  i64 nRow0 = sqli
11240 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
11250 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  Idx->aiRowLogEst
11260 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 55 70 70  [0]);.      iUpp
11270 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e 53  er = i>=pIdx->nS
11280 61 6d 70 6c 65 20 3f 20 6e 52 6f 77 30 20 3a 20  ample ? nRow0 : 
11290 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b  aSample[i].anLt[
112a0 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 4c 6f  iCol];.      iLo
112b0 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 2d  wer = aSample[i-
112c0 31 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 20 2b 20  1].anEq[iCol] + 
112d0 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e 4c  aSample[i-1].anL
112e0 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20  t[iCol];.    }. 
112f0 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49     aStat[1] = pI
11300 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d  dx->aAvgEq[iCol]
11310 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72  ;.    if( iLower
11320 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20  >=iUpper ){.    
11330 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20    iGap = 0;.    
11340 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61  }else{.      iGa
11350 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f  p = iUpper - iLo
11360 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  wer;.    }.    i
11370 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20  f( roundUp ){.  
11380 20 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70      iGap = (iGap
11390 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65  *2)/3;.    }else
113a0 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69  {.      iGap = i
113b0 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20  Gap/3;.    }.   
113c0 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77   aStat[0] = iLow
113d0 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 7d  er + iGap;.  }.}
113e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
113f0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
11400 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a  R_STAT4 */../*.*
11410 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  * If it is not N
11420 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20  ULL, pTerm is a 
11430 74 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64  term that provid
11440 65 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c  es an upper or l
11450 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e  ower.** bound on
11460 20 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57   a range scan. W
11470 69 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69  ithout consideri
11480 6e 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20  ng pTerm, it is 
11490 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68  estimated .** th
114a0 61 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c  at the scan will
114b0 20 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73   visit nNew rows
114c0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
114d0 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
114e0 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20  er.** estimated 
114f0 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 61 66  to be visited af
11500 74 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d  ter taking pTerm
11510 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a   into account..*
11520 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72  *.** If the user
11530 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
11540 69 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f  ified a likeliho
11550 6f 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74  od() value for t
11560 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65  his term,.** the
11570 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
11580 75 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69  ue is the likeli
11590 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20  hood multiplied 
115a0 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
115b0 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20  .** input rows. 
115c0 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20  Otherwise, this 
115d0 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
115e0 20 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54   that an "IS NOT
115f0 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68   NULL" term.** h
11600 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20  as a likelihood 
11610 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79  of 0.50, and any
11620 20 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69   other term a li
11630 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35  kelihood of 0.25
11640 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
11650 73 74 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a  st whereRangeAdj
11660 75 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70  ust(WhereTerm *p
11670 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65  Term, LogEst nNe
11680 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65  w){.  LogEst nRe
11690 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20  t = nNew;.  if( 
116a0 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28  pTerm ){.    if(
116b0 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
116c0 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  b<=0 ){.      nR
116d0 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  et += pTerm->tru
116e0 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73  thProb;.    }els
116f0 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74  e if( (pTerm->wt
11700 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
11710 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
11720 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20  nRet -= 20;     
11730 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73     assert( 20==s
11740 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20  qlite3LogEst(4) 
11750 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
11760 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 23  eturn nRet;.}..#
11770 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11780 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
11790 54 34 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66  T4./* .** This f
117a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
117b0 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  d to estimate th
117c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
117d0 20 76 69 73 69 74 65 64 20 62 79 20 61 0a 2a 2a   visited by a.**
117e0 20 72 61 6e 67 65 2d 73 63 61 6e 20 6f 6e 20 61   range-scan on a
117f0 20 73 6b 69 70 2d 73 63 61 6e 20 69 6e 64 65 78   skip-scan index
11800 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a  . For example:.*
11810 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e  *.**   CREATE IN
11820 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20  DEX i1 ON t1(a, 
11830 62 2c 20 63 29 3b 0a 2a 2a 20 20 20 53 45 4c 45  b, c);.**   SELE
11840 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
11850 52 45 20 61 3d 3f 20 41 4e 44 20 63 20 42 45 54  RE a=? AND c BET
11860 57 45 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a 2a  WEEN ? AND ?;.**
11870 0a 2a 2a 20 56 61 6c 75 65 20 70 4c 6f 6f 70 2d  .** Value pLoop-
11880 3e 6e 4f 75 74 20 69 73 20 63 75 72 72 65 6e 74  >nOut is current
11890 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 65 73  ly set to the es
118a0 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
118b0 66 20 72 6f 77 73 20 0a 2a 2a 20 76 69 73 69 74  f rows .** visit
118c0 65 64 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20  ed for scanning 
118d0 28 61 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e 20 54  (a=? AND b=?). T
118e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 64  his function red
118f0 75 63 65 73 20 74 68 61 74 20 65 73 74 69 6d 61  uces that estima
11900 74 65 20 0a 2a 2a 20 62 79 20 73 6f 6d 65 20 66  te .** by some f
11910 61 63 74 6f 72 20 74 6f 20 61 63 63 6f 75 6e 74  actor to account
11920 20 66 6f 72 20 74 68 65 20 28 63 20 42 45 54 57   for the (c BETW
11930 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 65 78 70  EEN ? AND ?) exp
11940 72 65 73 73 69 6f 6e 20 62 61 73 65 64 0a 2a 2a  ression based.**
11950 20 6f 6e 20 74 68 65 20 73 74 61 74 34 20 64 61   on the stat4 da
11960 74 61 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ta for the index
11970 2e 20 74 68 69 73 20 73 63 61 6e 20 77 69 6c 6c  . this scan will
11980 20 62 65 20 70 65 66 6f 72 6d 65 64 20 6d 75 6c   be peformed mul
11990 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 20  tiple .** times 
119a0 28 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 28  (once for each (
119b0 61 2c 62 29 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  a,b) combination
119c0 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 3d   that matches a=
119d0 3f 29 20 69 73 20 64 65 61 6c 74 20 77 69 74 68  ?) is dealt with
119e0 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
119f0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f 65  er..**.** It doe
11a00 73 20 74 68 69 73 20 62 79 20 73 63 61 6e 6e 69  s this by scanni
11a10 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 73  ng through all s
11a20 74 61 74 34 20 73 61 6d 70 6c 65 73 2c 20 63 6f  tat4 samples, co
11a30 6d 70 61 72 69 6e 67 20 76 61 6c 75 65 73 0a 2a  mparing values.*
11a40 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  * extracted from
11a50 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
11a60 65 72 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  er with the corr
11a70 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
11a80 20 69 6e 20 65 61 63 68 0a 2a 2a 20 73 61 6d 70   in each.** samp
11a90 6c 65 2e 20 49 66 20 4c 20 61 6e 64 20 55 20 61  le. If L and U a
11aa0 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
11ab0 20 73 61 6d 70 6c 65 73 20 66 6f 75 6e 64 20 74   samples found t
11ac0 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f  o be less than o
11ad0 72 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74 68  r.** equal to th
11ae0 65 20 76 61 6c 75 65 73 20 65 78 74 72 61 63 74  e values extract
11af0 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61  ed from pLower a
11b00 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63  nd pUpper respec
11b10 74 69 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20 4e  tively, and.** N
11b20 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
11b30 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 2c  mber of samples,
11b40 20 74 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74   the pLoop->nOut
11b50 20 76 61 6c 75 65 20 69 73 20 61 64 6a 75 73 74   value is adjust
11b60 65 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73  ed.** as follows
11b70 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20 3d  :.**.**   nOut =
11b80 20 6e 4f 75 74 20 2a 20 28 20 6d 69 6e 28 55 20   nOut * ( min(U 
11b90 2d 20 4c 2c 20 31 29 20 2f 20 4e 20 29 0a 2a 2a  - L, 1) / N ).**
11ba0 0a 2a 2a 20 49 66 20 70 4c 6f 77 65 72 20 69 73  .** If pLower is
11bb0 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75   NULL, or a valu
11bc0 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72  e cannot be extr
11bd0 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 74  acted from the t
11be0 65 72 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73 65 74  erm, L is.** set
11bf0 20 74 6f 20 7a 65 72 6f 2e 20 49 66 20 70 55 70   to zero. If pUp
11c00 70 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20  per is NULL, or 
11c10 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62  a value cannot b
11c20 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
11c30 20 69 74 2c 0a 2a 2a 20 55 20 69 73 20 73 65 74   it,.** U is set
11c40 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72   to N..**.** Nor
11c50 6d 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  mally, this func
11c60 74 69 6f 6e 20 73 65 74 73 20 2a 70 62 44 6f 6e  tion sets *pbDon
11c70 65 20 74 6f 20 31 20 62 65 66 6f 72 65 20 72 65  e to 1 before re
11c80 74 75 72 6e 69 6e 67 2e 20 48 6f 77 65 76 65 72  turning. However
11c90 2c 0a 2a 2a 20 69 66 20 6e 6f 20 76 61 6c 75 65  ,.** if no value
11ca0 20 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65   can be extracte
11cb0 64 20 66 72 6f 6d 20 65 69 74 68 65 72 20 70 4c  d from either pL
11cc0 6f 77 65 72 20 6f 72 20 70 55 70 70 65 72 20 28  ower or pUpper (
11cd0 61 6e 64 20 73 6f 20 74 68 65 0a 2a 2a 20 65 73  and so the.** es
11ce0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
11cf0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 64 65 6c  mber of rows del
11d00 69 76 65 72 65 64 20 72 65 6d 61 69 6e 73 20 75  ivered remains u
11d10 6e 63 68 61 6e 67 65 64 29 2c 20 2a 70 62 44 6f  nchanged), *pbDo
11d20 6e 65 0a 2a 2a 20 69 73 20 6c 65 66 74 20 61 73  ne.** is left as
11d30 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e   is..**.** If an
11d40 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
11d50 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
11d60 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
11d70 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20   Otherwise, .** 
11d80 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
11d90 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61  atic int whereRa
11da0 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28 0a  ngeSkipScanEst(.
11db0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11dc0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
11dd0 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
11de0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
11df0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77   WhereTerm *pLow
11e00 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62  er,   /* Lower b
11e10 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
11e20 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d  e. ex: "x>123" M
11e30 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
11e40 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70    WhereTerm *pUp
11e50 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20  per,   /* Upper 
11e60 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
11e70 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20  ge. ex: "x<455" 
11e80 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
11e90 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
11ea0 6f 6f 70 2c 20 20 20 20 2f 2a 20 55 70 64 61 74  oop,    /* Updat
11eb0 65 20 74 68 65 20 2e 6e 4f 75 74 20 76 61 6c 75  e the .nOut valu
11ec0 65 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20 2a  e of this loop *
11ed0 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6f 6e 65 20  /.  int *pbDone 
11ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
11ef0 74 6f 20 74 72 75 65 20 69 66 20 61 74 20 6c 65  to true if at le
11f00 61 73 74 20 6f 6e 65 20 65 78 70 72 2e 20 76 61  ast one expr. va
11f10 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 2a 2f  lue extracted */
11f20 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  .){.  Index *p =
11f30 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
11f40 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45  pIndex;.  int nE
11f50 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
11f60 65 65 2e 6e 45 71 3b 0a 20 20 73 71 6c 69 74 65  ee.nEq;.  sqlite
11f70 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
11f80 64 62 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77 65 72  db;.  int nLower
11f90 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 55 70   = -1;.  int nUp
11fa0 70 65 72 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c 65  per = p->nSample
11fb0 2b 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  +1;.  int rc = S
11fc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
11fd0 69 43 6f 6c 20 3d 20 70 2d 3e 61 69 43 6f 6c 75  iCol = p->aiColu
11fe0 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 75 38 20 61 66  mn[nEq];.  u8 af
11ff0 66 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 2d  f = iCol>=0 ? p-
12000 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
12010 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20 53  ol].affinity : S
12020 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
12030 52 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  R;.  CollSeq *pC
12040 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65  oll;.  .  sqlite
12050 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20 30 3b  3_value *p1 = 0;
12060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
12070 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ue extracted fro
12080 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73 71  m pLower */.  sq
12090 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 32 20  lite3_value *p2 
120a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
120b0 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64   Value extracted
120c0 20 66 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f 0a   from pUpper */.
120d0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
120e0 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20  *pVal = 0;      
120f0 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61    /* Value extra
12100 63 74 65 64 20 66 72 6f 6d 20 72 65 63 6f 72 64  cted from record
12110 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73   */..  pColl = s
12120 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
12130 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 61  Seq(pParse, p->a
12140 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69  zColl[nEq]);.  i
12150 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20  f( pLower ){.   
12160 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
12170 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  t4ValueFromExpr(
12180 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d 3e  pParse, pLower->
12190 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61  pExpr->pRight, a
121a0 66 66 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e 4c  ff, &p1);.    nL
121b0 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ower = 0;.  }.  
121c0 69 66 28 20 70 55 70 70 65 72 20 26 26 20 72 63  if( pUpper && rc
121d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
121e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
121f0 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70  tat4ValueFromExp
12200 72 28 70 50 61 72 73 65 2c 20 70 55 70 70 65 72  r(pParse, pUpper
12210 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
12220 20 61 66 66 2c 20 26 70 32 29 3b 0a 20 20 20 20   aff, &p2);.    
12230 6e 55 70 70 65 72 20 3d 20 70 32 20 3f 20 30 20  nUpper = p2 ? 0 
12240 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20  : p->nSample;.  
12250 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c 20 70  }..  if( p1 || p
12260 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  2 ){.    int i;.
12270 20 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a 20      int nDiff;. 
12280 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
12290 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
122a0 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  ->nSample; i++){
122b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
122c0 74 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28 64  te3Stat4Column(d
122d0 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d  b, p->aSample[i]
122e0 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69  .p, p->aSample[i
122f0 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c 29  ].n, nEq, &pVal)
12300 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
12310 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 20  SQLITE_OK && p1 
12320 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
12330 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  es = sqlite3MemC
12340 6f 6d 70 61 72 65 28 70 31 2c 20 70 56 61 6c 2c  ompare(p1, pVal,
12350 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20   pColl);.       
12360 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 4c   if( res>=0 ) nL
12370 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  ower++;.      }.
12380 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
12390 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32 20 29 7b  LITE_OK && p2 ){
123a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
123b0 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
123c0 70 61 72 65 28 70 32 2c 20 70 56 61 6c 2c 20 70  pare(p2, pVal, p
123d0 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  Coll);.        i
123e0 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 55 70 70  f( res>=0 ) nUpp
123f0 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er++;.      }.  
12400 20 20 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d 20    }.    nDiff = 
12410 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65 72  (nUpper - nLower
12420 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66  );.    if( nDiff
12430 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d 20 31 3b  <=0 ) nDiff = 1;
12440 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
12450 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70  e is both an upp
12460 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75  er and lower bou
12470 6e 64 20 73 70 65 63 69 66 69 65 64 2c 20 61 6e  nd specified, an
12480 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f  d the .    ** co
12490 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63 61  mparisons indica
124a0 74 65 20 74 68 61 74 20 74 68 65 79 20 61 72 65  te that they are
124b0 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 2c   close together,
124c0 20 75 73 65 20 74 68 65 20 66 61 6c 6c 62 61 63   use the fallbac
124d0 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20  k.    ** method 
124e0 28 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65  (assume that the
124f0 20 73 63 61 6e 20 76 69 73 69 74 73 20 31 2f 36   scan visits 1/6
12500 34 20 6f 66 20 74 68 65 20 72 6f 77 73 29 20 66  4 of the rows) f
12510 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 20 20  or estimating.  
12520 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
12530 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 2e  of rows visited.
12540 20 4f 74 68 65 72 77 69 73 65 2c 20 65 73 74 69   Otherwise, esti
12550 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
12560 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 75  of rows.    ** u
12570 73 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64 20  sing the method 
12580 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
12590 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
125a0 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  for this functio
125b0 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 44  n. */.    if( nD
125c0 69 66 66 21 3d 31 20 7c 7c 20 70 55 70 70 65 72  iff!=1 || pUpper
125d0 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30  ==0 || pLower==0
125e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41   ){.      int nA
125f0 64 6a 75 73 74 20 3d 20 28 73 71 6c 69 74 65 33  djust = (sqlite3
12600 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70 6c  LogEst(p->nSampl
12610 65 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67 45  e) - sqlite3LogE
12620 73 74 28 6e 44 69 66 66 29 29 3b 0a 20 20 20 20  st(nDiff));.    
12630 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d    pLoop->nOut -=
12640 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20 20 20   nAdjust;.      
12650 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  *pbDone = 1;.   
12660 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
12670 31 30 2c 20 28 22 72 61 6e 67 65 20 73 6b 69 70  10, ("range skip
12680 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25  -scan regions: %
12690 75 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d 25 64  u..%u  adjust=%d
126a0 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   est=%d\n",.    
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126c0 20 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20 6e         nLower, n
126d0 55 70 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a 2d  Upper, nAdjust*-
126e0 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29  1, pLoop->nOut))
126f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
12700 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  {.    assert( *p
12710 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a  bDone==0 );.  }.
12720 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
12730 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74  ree(p1);.  sqlit
12740 65 33 56 61 6c 75 65 46 72 65 65 28 70 32 29 3b  e3ValueFree(p2);
12750 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
12760 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65  ree(pVal);..  re
12770 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
12780 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
12790 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
127a0 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  4 */../*.** This
127b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
127c0 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  d to estimate th
127d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
127e0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69   that will be vi
127f0 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e  sited.** by scan
12800 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f  ning an index fo
12810 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c  r a range of val
12820 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d  ues. The range m
12830 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72  ay have an upper
12840 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77  .** bound, a low
12850 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74  er bound, or bot
12860 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  h. The WHERE cla
12870 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73  use terms that s
12880 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20  et the upper.** 
12890 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73  and lower bounds
128a0 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64   are represented
128b0 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70   by pLower and p
128c0 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65  Upper respective
128d0 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  ly. For.** examp
128e0 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  le, assuming tha
128f0 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20  t index p is on 
12900 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  t1(a):.**.**   .
12910 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
12920 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f   a > ? AND a < ?
12930 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
12940 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f             |____
12950 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20  _|   |_____|.** 
12960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12970 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
12980 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
12990 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20           pLower 
129a0 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20     pUpper.**.** 
129b0 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  If either of the
129c0 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20   upper or lower 
129d0 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65  bound is not pre
129e0 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20  sent, then NULL 
129f0 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20  is passed in.** 
12a00 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72  place of the cor
12a10 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65  responding Where
12a20 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Term..**.** The 
12a30 76 61 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64  value in (pBuild
12a40 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
12a50 65 2e 6e 45 71 29 20 69 73 20 74 68 65 20 69 6e  e.nEq) is the in
12a60 64 65 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78  dex of the index
12a70 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65  .** column subje
12a80 63 74 20 74 6f 20 74 68 65 20 72 61 6e 67 65 20  ct to the range 
12a90 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20  constraint. Or, 
12aa0 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68  equivalently, th
12ab0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65  e number of.** e
12ac0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
12ad0 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64 20 62 79  nts optimized by
12ae0 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e   the proposed in
12af0 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78  dex scan. For ex
12b00 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69  ample,.** assumi
12b10 6e 67 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e  ng index p is on
12b20 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74   t1(a, b), and t
12b30 68 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a  he SQL query is:
12b40 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
12b50 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f  M t1 WHERE a = ?
12b60 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62   AND b > ? AND b
12b70 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
12b80 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74  hen nEq is set t
12b90 6f 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67  o 1 (as the rang
12ba0 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c  e restricted col
12bb0 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65 20 73  umn, b, is the s
12bc0 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d  econd .** left-m
12bd0 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ost column of th
12be0 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66  e index). Or, if
12bf0 20 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a   the query is:.*
12c00 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
12c10 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41  t1 WHERE a > ? A
12c20 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a  ND a < ? ....**.
12c30 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73  ** then nEq is s
12c40 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57  et to 0..**.** W
12c50 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
12c60 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e  n is called, *pn
12c70 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  Out is set to th
12c80 65 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  e sqlite3LogEst(
12c90 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  ) of the.** numb
12ca0 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
12cb0 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20 69  the index scan i
12cc0 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 76 69  s expected to vi
12cd0 73 69 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20  sit without .** 
12ce0 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20  considering the 
12cf0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
12d00 73 2e 20 49 66 20 6e 45 71 20 69 73 20 30 2c 20  s. If nEq is 0, 
12d10 74 68 69 73 20 69 73 20 74 68 65 20 6e 75 6d 62  this is the numb
12d20 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69  er of .** rows i
12d30 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73 73  n the index. Ass
12d40 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f  uming no error o
12d50 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73  ccurs, *pnOut is
12d60 20 61 64 6a 75 73 74 65 64 20 28 72 65 64 75 63   adjusted (reduc
12d70 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e  ed).** to accoun
12d80 74 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65 20  t for the range 
12d90 63 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f 77  constraints pLow
12da0 65 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a  er and pUpper..*
12db0 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73  * .** In the abs
12dc0 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73  ence of sqlite_s
12dd0 74 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61 74  tat4 ANALYZE dat
12de0 61 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64 61  a, or if such da
12df0 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ta cannot be.** 
12e00 75 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 72  used, a single r
12e10 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 20  ange inequality 
12e20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72  reduces the sear
12e30 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66 61  ch space by a fa
12e40 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 61  ctor of 4. .** a
12e50 6e 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f 6e  nd a pair of con
12e60 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e  straints (x>? AN
12e70 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20 74  D x<?) reduces t
12e80 68 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62  he expected numb
12e90 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69  er of.** rows vi
12ea0 73 69 74 65 64 20 62 79 20 61 20 66 61 63 74 6f  sited by a facto
12eb0 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61 74  r of 64..*/.stat
12ec0 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67  ic int whereRang
12ed0 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  eScanEst(.  Pars
12ee0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
12ef0 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
12f00 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
12f10 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
12f20 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
12f30 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54 65  ilder,.  WhereTe
12f40 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a  rm *pLower,   /*
12f50 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Lower bound on 
12f60 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
12f70 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20  x>123" Might be 
12f80 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54  NULL */.  WhereT
12f90 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f  erm *pUpper,   /
12fa0 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e  * Upper bound on
12fb0 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
12fc0 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65  "x<455" Might be
12fd0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
12fe0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20  Loop *pLoop     
12ff0 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e  /* Modify the .n
13000 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e 72  Out and maybe .r
13010 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b  Run fields */.){
13020 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13030 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75  TE_OK;.  int nOu
13040 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b  t = pLoop->nOut;
13050 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a  .  LogEst nNew;.
13060 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
13070 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
13080 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70 20  TAT4.  Index *p 
13090 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
130a0 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e  .pIndex;.  int n
130b0 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
130c0 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20  ree.nEq;..  if( 
130d0 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 0a 20 20 20  p->nSample>0.   
130e0 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c  && nEq<p->nSampl
130f0 65 43 6f 6c 0a 20 20 29 7b 0a 20 20 20 20 69 66  eCol.  ){.    if
13100 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65 72 2d  ( nEq==pBuilder-
13110 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b 0a 20 20  >nRecValid ){.  
13120 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f      UnpackedReco
13130 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c  rd *pRec = pBuil
13140 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20 20  der->pRec;.     
13150 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20   tRowcnt a[2];. 
13160 20 20 20 20 20 75 38 20 61 66 66 3b 0a 0a 20 20       u8 aff;..  
13170 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20      /* Variable 
13180 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65 20 73  iLower will be s
13190 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  et to the estima
131a0 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
131b0 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20 20 20   of rows in .   
131c0 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20     ** the index 
131d0 74 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68  that are less th
131e0 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  an the lower bou
131f0 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20  nd of the range 
13200 71 75 65 72 79 2e 20 54 68 65 0a 20 20 20 20 20  query. The.     
13210 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20   ** lower bound 
13220 62 65 69 6e 67 20 74 68 65 20 63 6f 6e 63 61 74  being the concat
13230 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e  enation of $P an
13240 64 20 24 4c 2c 20 77 68 65 72 65 20 24 50 20 69  d $L, where $P i
13250 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6b  s the.      ** k
13260 65 79 2d 70 72 65 66 69 78 20 66 6f 72 6d 65 64  ey-prefix formed
13270 20 62 79 20 74 68 65 20 6e 45 71 20 76 61 6c 75   by the nEq valu
13280 65 73 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e  es matched again
13290 73 74 20 74 68 65 20 6e 45 71 20 6c 65 66 74 2d  st the nEq left-
132a0 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  most.      ** co
132b0 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
132c0 65 78 2c 20 61 6e 64 20 24 4c 20 69 73 20 74 68  ex, and $L is th
132d0 65 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65  e value in pLowe
132e0 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
132f0 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77    ** Or, if pLow
13300 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c  er is NULL or $L
13310 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
13320 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65  cted from it (be
13330 63 61 75 73 65 20 69 74 0a 20 20 20 20 20 20 2a  cause it.      *
13340 2a 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c  * is not a simpl
13350 65 20 76 61 72 69 61 62 6c 65 20 6f 72 20 6c 69  e variable or li
13360 74 65 72 61 6c 20 76 61 6c 75 65 29 2c 20 74 68  teral value), th
13370 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66  e lower bound of
13380 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 61   the.      ** ra
13390 6e 67 65 20 69 73 20 24 50 2e 20 44 75 65 20 74  nge is $P. Due t
133a0 6f 20 61 20 71 75 69 72 6b 20 69 6e 20 74 68 65  o a quirk in the
133b0 20 77 61 79 20 77 68 65 72 65 4b 65 79 53 74 61   way whereKeySta
133c0 74 73 28 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e  ts() works, even
133d0 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 24 4c 20  .      ** if $L 
133e0 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 77 68  is available, wh
133f0 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 69 73  ereKeyStats() is
13400 20 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68   called for both
13410 20 28 24 50 29 20 61 6e 64 20 0a 20 20 20 20 20   ($P) and .     
13420 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61 6e 64 20   ** ($P:$L) and 
13430 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68  the larger of th
13440 65 20 74 77 6f 20 72 65 74 75 72 6e 65 64 20 76  e two returned v
13450 61 6c 75 65 73 20 75 73 65 64 2e 0a 20 20 20 20  alues used..    
13460 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69    **.      ** Si
13470 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72 20  milarly, iUpper 
13480 69 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20  is to be set to 
13490 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  the estimate of 
134a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
134b0 77 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73  ws.      ** less
134c0 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20   than the upper 
134d0 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
134e0 67 65 20 71 75 65 72 79 2e 20 57 68 65 72 65 20  ge query. Where 
134f0 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a  the upper bound.
13500 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
13510 65 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24  er ($P) or ($P:$
13520 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20  U). Again, even 
13530 69 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62  if $U is availab
13540 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a  le, both values.
13550 20 20 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70        ** of iUpp
13560 65 72 20 61 72 65 20 72 65 71 75 65 73 74 65 64  er are requested
13570 20 6f 66 20 77 68 65 72 65 4b 65 79 53 74 61 74   of whereKeyStat
13580 73 28 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c  s() and the smal
13590 6c 65 72 20 75 73 65 64 2e 0a 20 20 20 20 20 20  ler used..      
135a0 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74  */.      tRowcnt
135b0 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 20 20 74   iLower;.      t
135c0 52 6f 77 63 6e 74 20 69 55 70 70 65 72 3b 0a 0a  Rowcnt iUpper;..
135d0 20 20 20 20 20 20 69 66 28 20 70 52 65 63 20 29        if( pRec )
135e0 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
135f0 73 65 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  se( pRec->nField
13600 21 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  !=pBuilder->nRec
13610 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Valid );.       
13620 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
13630 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
13640 6c 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lid;.      }.   
13650 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 2d 3e 6e     if( nEq==p->n
13660 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
13670 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
13680 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
13690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
136a0 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65   aff = p->pTable
136b0 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75  ->aCol[p->aiColu
136c0 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69 6e 69 74  mn[nEq]].affinit
136d0 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  y;.      }.     
136e0 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c   /* Determine iL
136f0 6f 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20  ower and iUpper 
13700 75 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e  using ($P) only.
13710 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45   */.      if( nE
13720 71 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  q==0 ){.        
13730 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20  iLower = 0;.    
13740 20 20 20 20 69 55 70 70 65 72 20 3d 20 70 2d 3e      iUpper = p->
13750 6e 52 6f 77 45 73 74 30 3b 0a 20 20 20 20 20 20  nRowEst0;.      
13760 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
13770 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c  * Note: this cal
13780 6c 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d  l could be optim
13790 69 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63  ized away - sinc
137a0 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  e the same value
137b0 73 20 6d 75 73 74 20 0a 20 20 20 20 20 20 20 20  s must .        
137c0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 72 65 71  ** have been req
137d0 75 65 73 74 65 64 20 77 68 65 6e 20 74 65 73 74  uested when test
137e0 69 6e 67 20 6b 65 79 20 24 50 20 69 6e 20 77 68  ing key $P in wh
137f0 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
13800 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77  ).  */.        w
13810 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
13820 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
13830 20 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4c 6f   a);.        iLo
13840 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20  wer = a[0];.    
13850 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30      iUpper = a[0
13860 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20  ] + a[1];.      
13870 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
13880 20 70 4c 6f 77 65 72 3d 3d 30 20 7c 7c 20 28 70   pLower==0 || (p
13890 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
138a0 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
138b0 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  )!=0 );.      as
138c0 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20  sert( pUpper==0 
138d0 7c 7c 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  || (pUpper->eOpe
138e0 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57  rator & (WO_LT|W
138f0 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_LE))!=0 );.   
13900 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53     assert( p->aS
13910 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
13920 20 20 20 20 20 69 66 28 20 70 2d 3e 61 53 6f 72       if( p->aSor
13930 74 4f 72 64 65 72 5b 6e 45 71 5d 20 29 7b 0a 20  tOrder[nEq] ){. 
13940 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
13950 6c 65 73 20 6f 66 20 70 4c 6f 77 65 72 20 61 6e  les of pLower an
13960 64 20 70 55 70 70 65 72 20 61 72 65 20 73 77 61  d pUpper are swa
13970 70 70 65 64 20 66 6f 72 20 61 20 44 45 53 43 20  pped for a DESC 
13980 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
13990 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 2a   SWAP(WhereTerm*
139a0 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72  , pLower, pUpper
139b0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
139c0 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65    /* If possible
139d0 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65  , improve on the
139e0 20 69 4c 6f 77 65 72 20 65 73 74 69 6d 61 74 65   iLower estimate
139f0 20 75 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e 20   using ($P:$L). 
13a00 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  */.      if( pLo
13a10 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  wer ){.        i
13a20 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20  nt bOk;         
13a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
13a40 75 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65  ue if value is e
13a50 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45  xtracted from pE
13a60 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  xpr */.        E
13a70 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f  xpr *pExpr = pLo
13a80 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  wer->pExpr->pRig
13a90 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
13aa0 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
13ab0 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
13ac0 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
13ad0 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62  pr, aff, nEq, &b
13ae0 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Ok);.        if(
13af0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13b00 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20  & bOk ){.       
13b10 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b     tRowcnt iNew;
13b20 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65  .          where
13b30 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
13b40 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
13b50 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20  .          iNew 
13b60 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65  = a[0] + ((pLowe
13b70 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
13b80 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20  WO_GT|WO_LE)) ? 
13b90 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
13ba0 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c       if( iNew>iL
13bb0 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20  ower ) iLower = 
13bc0 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
13bd0 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
13be0 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    pLower = 0;.  
13bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13c00 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  .      /* If pos
13c10 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
13c20 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74  n the iUpper est
13c30 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
13c40 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  $U). */.      if
13c50 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  ( pUpper ){.    
13c60 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20      int bOk;    
13c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c80 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65  /* True if value
13c90 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
13ca0 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
13cb0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
13cc0 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d  = pUpper->pExpr-
13cd0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
13ce0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
13cf0 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
13d00 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
13d10 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45  , pExpr, aff, nE
13d20 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20  q, &bOk);.      
13d30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13d40 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
13d50 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
13d60 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
13d70 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
13d80 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 31  arse, p, pRec, 1
13d90 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , a);.          
13da0 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28  iNew = a[0] + ((
13db0 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
13dc0 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45  r & (WO_GT|WO_LE
13dd0 29 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a  )) ? a[1] : 0);.
13de0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
13df0 65 77 3c 69 55 70 70 65 72 20 29 20 69 55 70 70  ew<iUpper ) iUpp
13e00 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20  er = iNew;.     
13e10 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20       nOut--;.   
13e20 20 20 20 20 20 20 20 70 55 70 70 65 72 20 3d 20         pUpper = 
13e30 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
13e40 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 69     }..      pBui
13e50 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65  lder->pRec = pRe
13e60 63 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  c;.      if( rc=
13e70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13e80 20 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72        if( iUpper
13e90 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20  >iLower ){.     
13ea0 20 20 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69       nNew = sqli
13eb0 74 65 33 4c 6f 67 45 73 74 28 69 55 70 70 65 72  te3LogEst(iUpper
13ec0 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20   - iLower);.    
13ed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13ee0 20 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20       nNew = 10; 
13ef0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31         assert( 1
13f00 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
13f10 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  (2) );.        }
13f20 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4e 65  .        if( nNe
13f30 77 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  w<nOut ){.      
13f40 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b      nOut = nNew;
13f50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13f60 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
13f70 31 30 2c 20 28 22 53 54 41 54 34 20 72 61 6e 67  10, ("STAT4 rang
13f80 65 20 73 63 61 6e 3a 20 25 75 2e 2e 25 75 20 20  e scan: %u..%u  
13f90 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  est=%d\n",.     
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65        (u32)iLowe
13fc0 72 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20  r, (u32)iUpper, 
13fd0 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a  nOut));.      }.
13fe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13ff0 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a   int bDone = 0;.
14000 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
14010 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74  RangeSkipScanEst
14020 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2c  (pParse, pLower,
14030 20 70 55 70 70 65 72 2c 20 70 4c 6f 6f 70 2c 20   pUpper, pLoop, 
14040 26 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69  &bDone);.      i
14050 66 28 20 62 44 6f 6e 65 20 29 20 72 65 74 75 72  f( bDone ) retur
14060 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
14070 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
14080 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29  ARAMETER(pParse)
14090 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
140a0 45 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a  ETER(pBuilder);.
140b0 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72    assert( pLower
140c0 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 23 65   || pUpper );.#e
140d0 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
140e0 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70  Upper==0 || (pUp
140f0 70 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  per->wtFlags & T
14100 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b  ERM_VNULL)==0 );
14110 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52  .  nNew = whereR
14120 61 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f 77 65  angeAdjust(pLowe
14130 72 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65 77  r, nOut);.  nNew
14140 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a   = whereRangeAdj
14150 75 73 74 28 70 55 70 70 65 72 2c 20 6e 4e 65 77  ust(pUpper, nNew
14160 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  );..  /* TUNING:
14170 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
14180 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c  h an upper and l
14190 6f 77 65 72 20 6c 69 6d 69 74 2c 20 61 73 73 75  ower limit, assu
141a0 6d 65 20 74 68 65 20 72 61 6e 67 65 20 69 73 0a  me the range is.
141b0 20 20 2a 2a 20 72 65 64 75 63 65 64 20 62 79 20    ** reduced by 
141c0 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 37 35  an additional 75
141d0 25 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  %. This means th
141e0 61 74 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20  at, by default, 
141f0 61 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a 20 20  an open-ended.  
14200 2a 2a 20 72 61 6e 67 65 20 71 75 65 72 79 20 28  ** range query (
14210 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20 69 73  e.g. col > ?) is
14220 20 61 73 73 75 6d 65 64 20 74 6f 20 6d 61 74 63   assumed to matc
14230 68 20 31 2f 34 20 6f 66 20 74 68 65 20 72 6f 77  h 1/4 of the row
14240 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  s in the.  ** in
14250 64 65 78 2e 20 57 68 69 6c 65 20 61 20 63 6c 6f  dex. While a clo
14260 73 65 64 20 72 61 6e 67 65 20 28 65 2e 67 2e 20  sed range (e.g. 
14270 63 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  col BETWEEN ? AN
14280 44 20 3f 29 20 69 73 20 65 73 74 69 6d 61 74 65  D ?) is estimate
14290 64 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20  d to.  ** match 
142a0 31 2f 36 34 20 6f 66 20 74 68 65 20 69 6e 64 65  1/64 of the inde
142b0 78 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70 4c 6f  x. */ .  if( pLo
142c0 77 65 72 20 26 26 20 70 55 70 70 65 72 20 29 20  wer && pUpper ) 
142d0 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 0a 20 20 6e  nNew -= 20;..  n
142e0 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d  Out -= (pLower!=
142f0 30 29 20 2b 20 28 70 55 70 70 65 72 21 3d 30 29  0) + (pUpper!=0)
14300 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20  ;.  if( nNew<10 
14310 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69  ) nNew = 10;.  i
14320 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e  f( nNew<nOut ) n
14330 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20  Out = nNew;.#if 
14340 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41  defined(WHERETRA
14350 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66  CE_ENABLED).  if
14360 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f  ( pLoop->nOut>nO
14370 75 74 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54  ut ){.    WHERET
14380 52 41 43 45 28 30 78 31 30 2c 28 22 52 61 6e 67  RACE(0x10,("Rang
14390 65 20 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f  e scan lowers nO
143a0 75 74 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64  ut from %d to %d
143b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
143c0 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
143d0 6e 4f 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20  nOut, nOut));.  
143e0 7d 0a 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70  }.#endif.  pLoop
143f0 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74  ->nOut = (LogEst
14400 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20  )nOut;.  return 
14410 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
14420 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
14430 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a  3_OR_STAT4./*.**
14440 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   Estimate the nu
14450 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
14460 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
14470 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  ed based on.** a
14480 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  n equality const
14490 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e  raint x=VALUE an
144a0 64 20 77 68 65 72 65 20 74 68 61 74 20 56 41 4c  d where that VAL
144b0 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20  UE occurs in.** 
144c0 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61  the histogram da
144d0 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77  ta.  This only w
144e0 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74  orks when x is t
144f0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20  he left-most.** 
14500 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64  column of an ind
14510 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74  ex and sqlite_st
14520 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61  at3 histogram da
14530 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a  ta is available.
14540 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65  ** for that inde
14550 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d  x.  When pExpr==
14560 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
14570 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
14580 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22  s.** "x IS NULL"
14590 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56   instead of "x=V
145a0 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69  ALUE"..**.** Wri
145b0 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
145c0 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
145d0 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
145e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
145f0 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
14600 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
14610 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
14620 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
14630 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
14640 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14650 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
14660 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
14670 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
14680 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
14690 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
146a0 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
146b0 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
146c0 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
146d0 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
146e0 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
146f0 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
14700 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
14710 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
14720 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
14730 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
14740 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20  EqualScanEst(.  
14750 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
14760 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
14770 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
14780 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
14790 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
147a0 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70  *pBuilder,.  Exp
147b0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
147c0 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
147d0 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65  for VALUE in the
147e0 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61   x=VALUE constra
147f0 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  int */.  tRowcnt
14800 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a   *pnRow       /*
14810 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73   Write the revis
14820 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ed row estimate 
14830 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  here */.){.  Ind
14840 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72  ex *p = pBuilder
14850 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
14860 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45  pIndex;.  int nE
14870 71 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  q = pBuilder->pN
14880 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
14890 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
148a0 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64  d *pRec = pBuild
148b0 65 72 2d 3e 70 52 65 63 3b 0a 20 20 75 38 20 61  er->pRec;.  u8 a
148c0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
148d0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
148e0 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e  affinity */.  in
148f0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
14900 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75          /* Subfu
14910 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f  nction return co
14920 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  de */.  tRowcnt 
14930 61 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  a[2];           
14940 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20    /* Statistics 
14950 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20  */.  int bOk;.. 
14960 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20   assert( nEq>=1 
14970 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71  );.  assert( nEq
14980 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  <=p->nColumn );.
14990 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
149a0 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  mple!=0 );.  ass
149b0 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e  ert( p->nSample>
149c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
149d0 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
149e0 69 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20  id<nEq );..  /* 
149f0 49 66 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f  If values are no
14a00 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  t available for 
14a10 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68  all fields of th
14a20 65 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  e index to the l
14a30 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73  eft.  ** of this
14a40 20 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74   one, no estimat
14a50 65 20 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52  e can be made. R
14a60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
14a70 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20  FOUND. */.  if( 
14a80 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
14a90 6c 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20  lid<(nEq-1) ){. 
14aa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14ab0 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a  _NOTFOUND;.  }..
14ac0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20    /* This is an 
14ad0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c  optimization onl
14ae0 79 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  y. The call to s
14af0 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
14b00 53 65 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20  SetValue().  ** 
14b10 62 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75  below would retu
14b20 72 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  rn the same valu
14b30 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71  e.  */.  if( nEq
14b40 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  >=p->nColumn ){.
14b50 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a      *pnRow = 1;.
14b60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14b70 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66  E_OK;.  }..  aff
14b80 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43   = p->pTable->aC
14b90 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  ol[p->aiColumn[n
14ba0 45 71 2d 31 5d 5d 2e 61 66 66 69 6e 69 74 79 3b  Eq-1]].affinity;
14bb0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53  .  rc = sqlite3S
14bc0 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
14bd0 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52  e(pParse, p, &pR
14be0 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  ec, pExpr, aff, 
14bf0 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20  nEq-1, &bOk);.  
14c00 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
14c10 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63 21   pRec;.  if( rc!
14c20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
14c30 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62 4f  urn rc;.  if( bO
14c40 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  k==0 ) return SQ
14c50 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
14c60 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
14c70 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 77  alid = nEq;..  w
14c80 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
14c90 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
14ca0 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43   a);.  WHERETRAC
14cb0 45 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69 74  E(0x10,("equalit
14cc0 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20  y scan regions: 
14cd0 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d  %d\n", (int)a[1]
14ce0 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 61  ));.  *pnRow = a
14cf0 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e  [1];.  .  return
14d00 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
14d10 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
14d20 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
14d30 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
14d40 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
14d50 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
14d60 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
14d70 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
14d80 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61  l be returned ba
14d90 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20  sed on.** an IN 
14da0 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65  constraint where
14db0 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
14dc0 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f  side of the IN o
14dd0 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20  perator.** is a 
14de0 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20  list of values. 
14df0 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   Example:.**.** 
14e00 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49         WHERE x I
14e10 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a  N (1,2,3,4).**.*
14e20 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
14e30 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
14e40 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
14e50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14e60 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
14e70 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
14e80 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
14e90 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
14ea0 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
14eb0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
14ec0 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
14ed0 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
14ee0 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
14ef0 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
14f00 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
14f10 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
14f20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
14f30 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
14f40 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
14f50 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
14f60 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
14f70 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
14f80 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
14f90 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
14fa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14fb0 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a  whereInScanEst(.
14fc0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
14fd0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
14fe0 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
14ff0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
15000 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
15010 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45  r *pBuilder,.  E
15020 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
15030 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
15040 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48 53   list on the RHS
15050 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76 32   of "x IN (v1,v2
15060 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74  ,v3,...)" */.  t
15070 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20  Rowcnt *pnRow   
15080 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
15090 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
150a0 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
150b0 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42  .  Index *p = pB
150c0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
150d0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
150e0 69 36 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69  i64 nRow0 = sqli
150f0 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
15100 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
15110 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c  );.  int nRecVal
15120 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e  id = pBuilder->n
15130 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20  RecValid;.  int 
15140 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
15150 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
15160 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
15170 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74  /.  tRowcnt nEst
15180 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
15190 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f  umber of rows fo
151a0 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  r a single term 
151b0 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f  */.  tRowcnt nRo
151c0 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  wEst = 0;    /* 
151d0 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20  New estimate of 
151e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
151f0 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ws */.  int i;  
15200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15210 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
15220 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
15230 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20  >aSample!=0 );. 
15240 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
15250 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69  LITE_OK && i<pLi
15260 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
15270 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e 52 6f 77  .    nEst = nRow
15280 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  0;.    rc = wher
15290 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50  eEqualScanEst(pP
152a0 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
152b0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
152c0 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e  r, &nEst);.    n
152d0 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a  RowEst += nEst;.
152e0 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
152f0 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61  ecValid = nRecVa
15300 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  lid;.  }..  if( 
15310 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15320 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74  .    if( nRowEst
15330 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f 77 45   > nRow0 ) nRowE
15340 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20  st = nRow0;.    
15350 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74  *pnRow = nRowEst
15360 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
15370 28 30 78 31 30 2c 28 22 49 4e 20 72 6f 77 20 65  (0x10,("IN row e
15380 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 64 5c  stimate: est=%d\
15390 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20  n", nRowEst));. 
153a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 75   }.  assert( pBu
153b0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
153c0 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20  ==nRecValid );. 
153d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
153e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
153f0 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
15400 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  TAT4 */../*.** D
15410 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e  isable a term in
15420 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
15430 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e  e.  Except, do n
15440 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ot disable the t
15450 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e  erm.** if it con
15460 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54  trols a LEFT OUT
15470 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64  ER JOIN and it d
15480 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
15490 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72   in the ON.** or
154a0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
154b0 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a   that join..**.*
154c0 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74  * Consider the t
154d0 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e  erm t2.z='ok' in
154e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   the following q
154f0 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ueries:.**.**   
15500 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (1)  SELECT * FR
15510 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
15520 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
15530 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a  WHERE t2.z='ok'.
15540 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54  **   (2)  SELECT
15550 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
15560 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
15570 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
15580 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c  k'.**   (3)  SEL
15590 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
155a0 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e  2 WHERE t1.a=t2.
155b0 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
155c0 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27  **.** The t2.z='
155d0 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20  ok' is disabled 
155e0 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65  in the in (2) be
155f0 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61  cause it origina
15600 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  tes.** in the ON
15610 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65   clause.  The te
15620 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  rm is disabled i
15630 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74  n (3) because it
15640 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20   is not part.** 
15650 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
15660 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74  JOIN.  In (1), t
15670 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64  he term is not d
15680 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44  isabled..**.** D
15690 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20  isabling a term 
156a0 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d  causes that term
156b0 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65   to not be teste
156c0 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c  d in the inner l
156d0 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  oop.** of the jo
156e0 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69  in.  Disabling i
156f0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
15700 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61  n.  When terms a
15710 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
15720 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64  by indices, we d
15730 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70  isable them to p
15740 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74  revent redundant
15750 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e   tests in the in
15760 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65  ner.** loop.  We
15770 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63   would get the c
15780 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69  orrect results i
15790 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65  f nothing were e
157a0 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a  ver disabled,.**
157b0 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74   but joins might
157c0 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c   run a little sl
157d0 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b  ower.  The trick
157e0 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61   is to disable a
157f0 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20  s much.** as we 
15800 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61  can without disa
15810 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20  bling too much. 
15820 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20   If we disabled 
15830 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74  in (1), we'd get
15840 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e  .** the wrong an
15850 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65  swer.  See ticke
15860 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69  t #813..*/.stati
15870 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65  c void disableTe
15880 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  rm(WhereLevel *p
15890 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d  Level, WhereTerm
158a0 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20   *pTerm){.  if( 
158b0 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28  pTerm.      && (
158c0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
158d0 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a   TERM_CODED)==0.
158e0 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c        && (pLevel
158f0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c  ->iLeftJoin==0 |
15900 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
15910 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
15920 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20  EP_FromJoin)).  
15930 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e      && (pLevel->
15940 6e 6f 74 52 65 61 64 79 20 26 20 70 54 65 72 6d  notReady & pTerm
15950 2d 3e 70 72 65 72 65 71 41 6c 6c 29 3d 3d 30 0a  ->prereqAll)==0.
15960 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e    ){.    pTerm->
15970 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
15980 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70  CODED;.    if( p
15990 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30  Term->iParent>=0
159a0 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
159b0 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  erm *pOther = &p
159c0 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65  Term->pWC->a[pTe
159d0 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20  rm->iParent];.  
159e0 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65      if( (--pOthe
159f0 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b  r->nChild)==0 ){
15a00 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
15a10 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74  Term(pLevel, pOt
15a20 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  her);.      }.  
15a30 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
15a40 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69   Code an OP_Affi
15a50 6e 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61  nity opcode to a
15a60 70 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pply the column 
15a70 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
15a80 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e  zAff.** to the n
15a90 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
15aa0 69 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a  ing at base. .**
15ab0 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69  .** As an optimi
15ac0 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41  zation, SQLITE_A
15ad0 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20  FF_NONE entries 
15ae0 28 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70  (which are no-op
15af0 73 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67  s) at the.** beg
15b00 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f  inning and end o
15b10 66 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72  f zAff are ignor
15b20 65 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72  ed.  If all entr
15b30 69 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a  ies in zAff are.
15b40 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
15b50 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65  NE, then no code
15b60 20 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e   gets generated.
15b70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
15b80 69 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77  ine makes its ow
15b90 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73  n copy of zAff s
15ba0 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  o that the calle
15bb0 72 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20  r is free.** to 
15bc0 6d 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65  modify zAff afte
15bd0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  r this routine r
15be0 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  eturns..*/.stati
15bf0 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79  c void codeApply
15c00 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a  Affinity(Parse *
15c10 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65  pParse, int base
15c20 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a  , int n, char *z
15c30 41 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Aff){.  Vdbe *v 
15c40 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
15c50 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29  .  if( zAff==0 )
15c60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
15c70 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
15c80 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
15c90 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
15ca0 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f  rt( v!=0 );..  /
15cb0 2a 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e  * Adjust base an
15cc0 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72  d n to skip over
15cd0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
15ce0 20 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20   entries at the 
15cf0 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61  beginning.  ** a
15d00 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66  nd end of the af
15d10 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20  finity string.. 
15d20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30   */.  while( n>0
15d30 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c   && zAff[0]==SQL
15d40 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
15d50 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73      n--;.    bas
15d60 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b  e++;.    zAff++;
15d70 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e  .  }.  while( n>
15d80 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d  1 && zAff[n-1]==
15d90 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
15da0 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a  ){.    n--;.  }.
15db0 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f  .  /* Code the O
15dc0 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64  P_Affinity opcod
15dd0 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
15de0 79 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64  ything left to d
15df0 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20  o. */.  if( n>0 
15e00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
15e10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
15e20 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e  ffinity, base, n
15e30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15e40 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
15e50 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20  , zAff, n);.    
15e60 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
15e70 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
15e80 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b  Parse, base, n);
15e90 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
15ea0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
15eb0 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69   a single equali
15ec0 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  ty term of the W
15ed0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e  HERE clause.  An
15ee0 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72   equality.** ter
15ef0 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  m can be either 
15f00 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28  X=expr or X IN (
15f10 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73  ...).   pTerm is
15f20 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
15f30 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a  .** coded..**.**
15f40 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
15f50 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74  ue for the const
15f60 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e  raint is left in
15f70 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a   register iReg..
15f80 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73  **.** For a cons
15f90 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f  traint of the fo
15fa0 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65  rm X=expr, the e
15fb0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61  xpression is eva
15fc0 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a  luated and its.*
15fd0 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74  * result is left
15fe0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
15ff0 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  For constraints 
16000 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e  of the form X IN
16010 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72   (...).** this r
16020 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
16030 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
16040 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c  iterate over all
16050 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f   values of X..*/
16060 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
16070 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20  EqualityTerm(.  
16080 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
16090 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
160a0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
160b0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
160c0 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20  ,   /* The term 
160d0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
160e0 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20  use to be coded 
160f0 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
16100 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20  *pLevel, /* The 
16110 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f  level of the FRO
16120 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20  M clause we are 
16130 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
16140 69 6e 74 20 69 45 71 2c 20 20 20 20 20 20 20 20  int iEq,        
16150 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
16160 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  the equality ter
16170 6d 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65  m within this le
16180 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  vel */.  int bRe
16190 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v,           /* 
161a0 54 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65  True for reverse
161b0 2d 6f 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74  -order IN operat
161c0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  ions */.  int iT
161d0 61 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a  arget         /*
161e0 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76   Attempt to leav
161f0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69  e results in thi
16200 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
16210 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54  .  Expr *pX = pT
16220 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64  erm->pExpr;.  Vd
16230 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
16240 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65  pVdbe;.  int iRe
16250 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
16260 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
16270 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20  holding results 
16280 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54  */..  assert( iT
16290 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28  arget>0 );.  if(
162a0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29   pX->op==TK_EQ )
162b0 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c  {.    iReg = sql
162c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
162d0 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  et(pParse, pX->p
162e0 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b  Right, iTarget);
162f0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d  .  }else if( pX-
16300 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29  >op==TK_ISNULL )
16310 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61  {.    iReg = iTa
16320 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rget;.    sqlite
16330 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16340 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29  P_Null, 0, iReg)
16350 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
16360 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
16370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
16380 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69  eType;.    int i
16390 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Tab;.    struct 
163a0 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20  InLoop *pIn;.   
163b0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
163c0 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
163d0 6f 70 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c  op;..    if( (pL
163e0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
163f0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
16400 45 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70  E)==0.      && p
16410 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
16420 6e 64 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26  ndex!=0.      &&
16430 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
16440 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
16450 65 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20  er[iEq].    ){. 
16460 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
16470 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  Eq==0 );.      t
16480 65 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b  estcase( bRev );
16490 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62  .      bRev = !b
164a0 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  Rev;.    }.    a
164b0 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
164c0 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67  K_IN );.    iReg
164d0 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
164e0 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
164f0 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
16500 65 2c 20 70 58 2c 20 49 4e 5f 49 4e 44 45 58 5f  e, pX, IN_INDEX_
16510 4c 4f 4f 50 2c 20 30 29 3b 0a 20 20 20 20 69 66  LOOP, 0);.    if
16520 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
16530 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a  X_INDEX_DESC ){.
16540 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16550 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52  bRev );.      bR
16560 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20  ev = !bRev;.    
16570 7d 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d  }.    iTab = pX-
16580 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c  >iTable;.    sql
16590 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
165a0 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
165b0 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54   : OP_Rewind, iT
165c0 61 62 2c 20 30 29 3b 0a 20 20 20 20 56 64 62 65  ab, 0);.    Vdbe
165d0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
165e0 65 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ev);.    VdbeCov
165f0 65 72 61 67 65 49 66 28 76 2c 20 21 62 52 65 76  erageIf(v, !bRev
16600 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
16610 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
16620 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29   WHERE_MULTI_OR)
16630 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  ==0 );.    pLoop
16640 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
16650 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20  RE_IN_ABLE;.    
16660 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  if( pLevel->u.in
16670 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  .nIn==0 ){.     
16680 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
16690 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
166a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
166b0 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
166c0 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c  in.nIn++;.    pL
166d0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
166e0 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69  op =.       sqli
166f0 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
16700 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
16710 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
16720 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  oop,.           
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16740 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c     sizeof(pLevel
16750 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30  ->u.in.aInLoop[0
16760 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  ])*pLevel->u.in.
16770 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20  nIn);.    pIn = 
16780 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
16790 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49  Loop;.    if( pI
167a0 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b  n ){.      pIn +
167b0 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  = pLevel->u.in.n
167c0 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49  In - 1;.      pI
167d0 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a  n->iCur = iTab;.
167e0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
167f0 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
16800 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  ){.        pIn->
16810 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69  addrInTop = sqli
16820 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16830 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c   OP_Rowid, iTab,
16840 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65   iReg);.      }e
16850 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  lse{.        pIn
16860 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71  ->addrInTop = sq
16870 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16880 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
16890 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20  ab, 0, iReg);.  
168a0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d      }.      pIn-
168b0 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52  >eEndLoopOp = bR
168c0 65 76 20 3f 20 4f 50 5f 50 72 65 76 49 66 4f 70  ev ? OP_PrevIfOp
168d0 65 6e 20 3a 20 4f 50 5f 4e 65 78 74 49 66 4f 70  en : OP_NextIfOp
168e0 65 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  en;.      sqlite
168f0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16900 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b  P_IsNull, iReg);
16910 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
16920 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16930 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
16940 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  nIn = 0;.    }.#
16950 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61  endif.  }.  disa
16960 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
16970 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e  pTerm);.  return
16980 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
16990 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
169a0 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
169b0 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63   all == and IN c
169c0 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61  onstraints for a
169d0 6e 0a 2a 2a 20 69 6e 64 65 78 20 73 63 61 6e 2e  n.** index scan.
169e0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
169f0 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62  le, consider tab
16a00 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c  le t1(a,b,c,d,e,
16a10 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31  f) with index i1
16a20 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70  (a,b,c)..** Supp
16a30 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ose the WHERE cl
16a40 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61  ause is this:  a
16a50 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c  ==5 AND b IN (1,
16a60 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44  2,3) AND c>5 AND
16a70 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64   c<10.** The ind
16a80 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61  ex has as many a
16a90 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79  s three equality
16aa0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75   constraints, bu
16ab0 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61  t in this.** exa
16ac0 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20  mple, the third 
16ad0 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20  "c" value is an 
16ae0 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20  inequality.  So 
16af0 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e  only two .** con
16b00 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64  straints are cod
16b10 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
16b20 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  e will generate 
16b30 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
16b40 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49  .** a==5 and b I
16b50 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20  N (1,2,3).  The 
16b60 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
16b70 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20  or a and b will 
16b80 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  be stored.** in 
16b90 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
16ba0 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e  sters and the in
16bb0 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74  dex of the first
16bc0 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74   register is ret
16bd0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  urned..**.** In 
16be0 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
16bf0 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74  e nEq==2.  But t
16c00 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77  his subroutine w
16c10 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c  orks for any val
16c20 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63  ue.** of nEq inc
16c30 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45  luding 0.  If nE
16c40 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69  q==0, this routi
16c50 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e  ne is nearly a n
16c60 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  o-op..** The onl
16c70 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20  y thing it does 
16c80 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  is allocate the 
16c90 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d  pLevel->iMem mem
16ca0 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20  ory cell and.** 
16cb0 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69  compute the affi
16cc0 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  nity string..**.
16cd0 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 52 65 67  ** The nExtraReg
16ce0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
16cf0 6f 72 20 31 2e 20 20 49 74 20 69 73 20 30 20 69  or 1.  It is 0 i
16d00 66 20 61 6c 6c 20 57 48 45 52 45 20 63 6c 61 75  f all WHERE clau
16d10 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  se constraints.*
16d20 2a 20 61 72 65 20 3d 3d 20 6f 72 20 49 4e 20 61  * are == or IN a
16d30 6e 64 20 61 72 65 20 63 6f 76 65 72 65 64 20 62  nd are covered b
16d40 79 20 74 68 65 20 6e 45 71 2e 20 20 6e 45 78 74  y the nEq.  nExt
16d50 72 61 52 65 67 20 69 73 20 31 20 69 66 20 74 68  raReg is 1 if th
16d60 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 65  ere is.** an ine
16d70 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
16d80 6e 74 20 28 73 75 63 68 20 61 73 20 74 68 65 20  nt (such as the 
16d90 22 63 3e 3d 35 20 41 4e 44 20 63 3c 31 30 22 20  "c>=5 AND c<10" 
16da0 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20  in the example) 
16db0 74 68 61 74 0a 2a 2a 20 6f 63 63 75 72 73 20 61  that.** occurs a
16dc0 66 74 65 72 20 74 68 65 20 6e 45 71 20 71 75 61  fter the nEq qua
16dd0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
16de0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
16df0 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61  tine allocates a
16e00 20 72 61 6e 67 65 20 6f 66 20 6e 45 71 2b 6e 45   range of nEq+nE
16e10 78 74 72 61 52 65 67 20 6d 65 6d 6f 72 79 20 63  xtraReg memory c
16e20 65 6c 6c 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ells and returns
16e30 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66  .** the index of
16e40 20 74 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72   the first memor
16e50 79 20 63 65 6c 6c 20 69 6e 20 74 68 61 74 20 72  y cell in that r
16e60 61 6e 67 65 2e 20 54 68 65 20 63 6f 64 65 20 74  ange. The code t
16e70 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69  hat.** calls thi
16e80 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75  s routine will u
16e90 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 72  se that memory r
16ea0 61 6e 67 65 20 74 6f 20 73 74 6f 72 65 20 6b 65  ange to store ke
16eb0 79 73 20 66 6f 72 0a 2a 2a 20 73 74 61 72 74 20  ys for.** start 
16ec0 61 6e 64 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  and termination 
16ed0 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 66 20 74 68  conditions of th
16ee0 65 20 6c 6f 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76  e loop..** key v
16ef0 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  alue of the loop
16f00 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  .  If one or mor
16f10 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61  e IN operators a
16f20 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74  ppear, then.** t
16f30 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
16f40 63 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f  cates an additio
16f50 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63  nal nEq memory c
16f60 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61  ells for interna
16f70 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  l.** use..**.** 
16f80 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
16f90 2c 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20  , *pzAff is set 
16fa0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
16fb0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
16fc0 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65  a.** copy of the
16fd0 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
16fe0 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69   string of the i
16ff0 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75  ndex allocated u
17000 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44  sing.** sqlite3D
17010 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70  bMalloc(). Excep
17020 74 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  t, entries in th
17030 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74  e copy of the st
17040 72 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a  ring associated.
17050 2a 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74 79  ** with equality
17060 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61   constraints tha
17070 74 20 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e  t use NONE affin
17080 69 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a  ity are set to.*
17090 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
170a0 45 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64 65  E. This is to de
170b0 61 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63 68  al with SQL such
170c0 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   as the followin
170d0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  g:.**.**   CREAT
170e0 45 20 54 41 42 4c 45 20 74 31 28 61 20 54 45 58  E TABLE t1(a TEX
170f0 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  T PRIMARY KEY, b
17100 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e  );.**   SELECT .
17110 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32  .. FROM t1 AS t2
17120 2c 20 74 31 20 57 48 45 52 45 20 74 31 2e 61 20  , t1 WHERE t1.a 
17130 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e  = t2.b;.**.** In
17140 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
17150 76 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ve, the index on
17160 20 74 31 28 61 29 20 68 61 73 20 54 45 58 54 20   t1(a) has TEXT 
17170 61 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69  affinity. But si
17180 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74  nce.** the right
17190 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68   hand side of th
171a0 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
171b0 72 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73  raint (t2.b) has
171c0 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a   NONE affinity,.
171d0 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  ** no conversion
171e0 20 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d   should be attem
171f0 70 74 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e  pted before usin
17200 67 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61  g a t2.b value a
17210 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b  s part of.** a k
17220 65 79 20 74 6f 20 73 65 61 72 63 68 20 74 68 65  ey to search the
17230 20 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68   index. Hence th
17240 65 20 66 69 72 73 74 20 62 79 74 65 20 69 6e 20  e first byte in 
17250 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 66 66  the returned aff
17260 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20  inity.** string 
17270 69 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20  in this example 
17280 77 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20  would be set to 
17290 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
172a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
172b0 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
172c0 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
172d0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
172e0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
172f0 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
17300 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68  *pLevel,   /* Wh
17310 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  ich nested loop 
17320 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61  of the FROM we a
17330 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69  re coding */.  i
17340 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20  nt bRev,        
17350 20 20 20 20 20 2f 2a 20 52 65 76 65 72 73 65 20       /* Reverse 
17360 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20  the order of IN 
17370 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69  operators */.  i
17380 6e 74 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20  nt nExtraReg,   
17390 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
173a0 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
173b0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
173c0 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20  .  char **pzAff 
173d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
173e0 20 53 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   Set to point to
173f0 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
17400 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 45 71   */.){.  u16 nEq
17410 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17420 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
17430 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
17440 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
17450 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6e 53  code */.  u16 nS
17460 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  kip;            
17470 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17480 72 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20 63  r of left-most c
17490 6f 6c 75 6d 6e 73 20 74 6f 20 73 6b 69 70 20 2a  olumns to skip *
174a0 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
174b0 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
174c0 20 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65    /* The vm unde
174d0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
174e0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
174f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17500 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62    /* The index b
17510 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68  eing used for th
17520 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65  is loop */.  Whe
17530 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
17540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
17550 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e  single constrain
17560 74 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72  t term */.  Wher
17570 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
17580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17590 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
175a0 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  t */.  int j;   
175b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175c0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
175d0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nter */.  int re
175e0 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
175f0 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
17600 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
17610 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20  t nReg;         
17620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17630 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65  umber of registe
17640 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
17650 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20  /.  char *zAff; 
17660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17670 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74    /* Affinity st
17680 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a  ring to return *
17690 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64  /..  /* This mod
176a0 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ule is only call
176b0 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e  ed on query plan
176c0 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e  s that use an in
176d0 64 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20  dex. */.  pLoop 
176e0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
176f0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f  ;.  assert( (pLo
17700 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
17710 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
17720 29 3d 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20  )==0 );.  nEq = 
17730 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
17740 45 71 3b 0a 20 20 6e 53 6b 69 70 20 3d 20 70 4c  Eq;.  nSkip = pL
17750 6f 6f 70 2d 3e 6e 53 6b 69 70 3b 0a 20 20 70 49  oop->nSkip;.  pI
17760 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
17770 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61 73  ree.pIndex;.  as
17780 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b  sert( pIdx!=0 );
17790 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
177a0 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72  t how many memor
177b0 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20  y cells we will 
177c0 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61  need then alloca
177d0 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20  te them..  */.  
177e0 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65  regBase = pParse
177f0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52  ->nMem + 1;.  nR
17800 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  eg = pLoop->u.bt
17810 72 65 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61  ree.nEq + nExtra
17820 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  Reg;.  pParse->n
17830 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20  Mem += nReg;..  
17840 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62  zAff = sqlite3Db
17850 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  StrDup(pParse->d
17860 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41  b, sqlite3IndexA
17870 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49  ffinityStr(v, pI
17880 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41 66  dx));.  if( !zAf
17890 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  f ){.    pParse-
178a0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
178b0 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69 66  d = 1;.  }..  if
178c0 28 20 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 69  ( nSkip ){.    i
178d0 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65  nt iIdxCur = pLe
178e0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
178f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17900 4f 70 31 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f  Op1(v, (bRev?OP_
17910 4c 61 73 74 3a 4f 50 5f 52 65 77 69 6e 64 29 2c  Last:OP_Rewind),
17920 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 56   iIdxCur);.    V
17930 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
17940 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56   bRev==0);.    V
17950 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
17960 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 56   bRev!=0);.    V
17970 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
17980 62 65 67 69 6e 20 73 6b 69 70 2d 73 63 61 6e 20  begin skip-scan 
17990 6f 6e 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e  on %s", pIdx->zN
179a0 61 6d 65 29 29 3b 0a 20 20 20 20 6a 20 3d 20 73  ame));.    j = s
179b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
179c0 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
179d0 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b    pLevel->addrSk
179e0 69 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ip = sqlite3Vdbe
179f0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 28 62 52  AddOp4Int(v, (bR
17a00 65 76 3f 4f 50 5f 53 65 65 6b 4c 54 3a 4f 50 5f  ev?OP_SeekLT:OP_
17a10 53 65 65 6b 47 54 29 2c 0a 20 20 20 20 20 20 20  SeekGT),.       
17a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a30 20 20 20 20 20 69 49 64 78 43 75 72 2c 20 30 2c       iIdxCur, 0,
17a40 20 72 65 67 42 61 73 65 2c 20 6e 53 6b 69 70 29   regBase, nSkip)
17a50 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
17a60 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29  geIf(v, bRev==0)
17a70 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
17a80 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29  geIf(v, bRev!=0)
17a90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17aa0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 29 3b  eJumpHere(v, j);
17ab0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
17ac0 6e 53 6b 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nSkip; j++){.   
17ad0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17ae0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
17af0 6e 2c 20 69 49 64 78 43 75 72 2c 20 6a 2c 20 72  n, iIdxCur, j, r
17b00 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20  egBase+j);.     
17b10 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
17b20 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b  iColumn[j]>=0 );
17b30 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
17b40 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64  nt((v, "%s", pId
17b50 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
17b60 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
17b70 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  ]].zName));.    
17b80 7d 0a 20 20 7d 20 20 20 20 0a 0a 20 20 2f 2a 20  }.  }    ..  /* 
17b90 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75  Evaluate the equ
17ba0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
17bb0 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
17bc0 20 7a 41 66 66 3d 3d 30 20 7c 7c 20 28 69 6e 74   zAff==0 || (int
17bd0 29 73 74 72 6c 65 6e 28 7a 41 66 66 29 3e 3d 6e  )strlen(zAff)>=n
17be0 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 6e 53  Eq );.  for(j=nS
17bf0 6b 69 70 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29  kip; j<nEq; j++)
17c00 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20  {.    int r1;.  
17c10 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d    pTerm = pLoop-
17c20 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20  >aLTerm[j];.    
17c30 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
17c40 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   );.    /* The f
17c50 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 63 61 73  ollowing testcas
17c60 65 20 69 73 20 74 72 75 65 20 66 6f 72 20 69 6e  e is true for in
17c70 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75 6e  dices with redun
17c80 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20  dant columns. . 
17c90 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45     ** Ex: CREATE
17ca0 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
17cb0 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a  a,b,a); SELECT *
17cc0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
17cd0 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20  =0 AND b=0; */. 
17ce0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 54     testcase( (pT
17cf0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
17d00 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b  ERM_CODED)!=0 );
17d10 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
17d20 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
17d30 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
17d40 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71 75      r1 = codeEqu
17d50 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
17d60 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
17d70 20 6a 2c 20 62 52 65 76 2c 20 72 65 67 42 61 73   j, bRev, regBas
17d80 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31  e+j);.    if( r1
17d90 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20  !=regBase+j ){. 
17da0 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31       if( nReg==1
17db0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
17dc0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17dd0 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  g(pParse, regBas
17de0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42  e);.        regB
17df0 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20  ase = r1;.      
17e00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
17e10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17e20 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31  (v, OP_SCopy, r1
17e30 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
17e40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
17e50 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
17e60 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
17e70 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
17e80 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
17e90 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
17ea0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65   );.    if( (pTe
17eb0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
17ec0 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e  (WO_ISNULL|WO_IN
17ed0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ))==0 ){.      E
17ee0 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54  xpr *pRight = pT
17ef0 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
17f00 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ht;.      if( sq
17f10 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
17f20 6c 6c 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  ll(pRight) ){.  
17f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17f40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
17f50 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6a 2c  Null, regBase+j,
17f60 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
17f70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
17f80 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
17f90 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 41    }.      if( zA
17fa0 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
17fb0 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
17fc0 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
17fd0 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54   zAff[j])==SQLIT
17fe0 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
17ff0 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
18000 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
18010 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
18020 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
18030 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
18040 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
18050 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20  , zAff[j]) ){.  
18060 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
18070 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
18080 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
18090 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
180a0 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a   *pzAff = zAff;.
180b0 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65    return regBase
180c0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
180d0 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
180e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
180f0 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72 20  ine is a helper 
18100 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78  for explainIndex
18110 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a  Range() below.**
18120 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74  .** pStr holds t
18130 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78  he text of an ex
18140 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65  pression that we
18150 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70   are building up
18160 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20   one term.** at 
18170 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f  a time.  This ro
18180 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77  utine adds a new
18190 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64   term to the end
181a0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
181b0 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65  on..** Terms are
181c0 20 73 65 70 61 72 61 74 65 64 20 62 79 20 41 4e   separated by AN
181d0 44 20 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e  D so add the "AN
181e0 44 22 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f  D" text for seco
181f0 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
18200 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e  t.** terms only.
18210 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18220 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
18230 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70  m(.  StrAccum *p
18240 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Str,            
18250 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78 70   /* The text exp
18260 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75  ression being bu
18270 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  ilt */.  int iTe
18280 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
18290 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
182a0 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72   this term.  Fir
182b0 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20  st is zero */.  
182c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
182d0 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  umn,        /* N
182e0 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
182f0 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
18300 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20  r *zOp          
18310 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
18320 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b  e operator */.){
18330 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29 20 73  .  if( iTerm ) s
18340 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
18350 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44  pend(pStr, " AND
18360 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65   ", 5);.  sqlite
18370 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41  3StrAccumAppendA
18380 6c 6c 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e  ll(pStr, zColumn
18390 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
183a0 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
183b0 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69   zOp, 1);.  sqli
183c0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
183d0 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b  d(pStr, "?", 1);
183e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
183f0 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69  nt pLevel descri
18400 62 65 73 20 61 20 73 74 72 61 74 65 67 79 20 66  bes a strategy f
18410 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c  or scanning tabl
18420 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a  e pTab. This .**
18430 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
18440 73 20 74 65 78 74 20 74 6f 20 70 53 74 72 20 74  s text to pStr t
18450 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
18460 65 20 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c  e subset of tabl
18470 65 0a 2a 2a 20 72 6f 77 73 20 73 63 61 6e 6e 65  e.** rows scanne
18480 64 20 62 79 20 74 68 65 20 73 74 72 61 74 65 67  d by the strateg
18490 79 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66  y in the form of
184a0 20 61 6e 20 53 51 4c 20 65 78 70 72 65 73 73 69   an SQL expressi
184b0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  on..**.** For ex
184c0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75  ample, if the qu
184d0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ery:.**.**   SEL
184e0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
184f0 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b  ERE a=1 AND b>2;
18500 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e  .**.** is run an
18510 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  d there is an in
18520 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74  dex on (a, b), t
18530 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
18540 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73  n returns a.** s
18550 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f  tring similar to
18560 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41  :.**.**   "a=? A
18570 4e 44 20 62 3e 3f 22 0a 2a 2f 0a 73 74 61 74 69  ND b>?".*/.stati
18580 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 49 6e  c void explainIn
18590 64 65 78 52 61 6e 67 65 28 53 74 72 41 63 63 75  dexRange(StrAccu
185a0 6d 20 2a 70 53 74 72 2c 20 57 68 65 72 65 4c 6f  m *pStr, WhereLo
185b0 6f 70 20 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c 65  op *pLoop, Table
185c0 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78   *pTab){.  Index
185d0 20 2a 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70   *pIndex = pLoop
185e0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
185f0 3b 0a 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c  ;.  u16 nEq = pL
18600 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
18610 3b 0a 20 20 75 31 36 20 6e 53 6b 69 70 20 3d 20  ;.  u16 nSkip = 
18620 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3b 0a 20 20  pLoop->nSkip;.  
18630 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75  int i, j;.  Colu
18640 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d  mn *aCol = pTab-
18650 3e 61 43 6f 6c 3b 0a 20 20 69 31 36 20 2a 61 69  >aCol;.  i16 *ai
18660 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
18670 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 69 66  >aiColumn;..  if
18680 28 20 6e 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f  ( nEq==0 && (pLo
18690 6f 70 2d 3e 77 73 46 6c 61 67 73 26 28 57 48 45  op->wsFlags&(WHE
186a0 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45  RE_BTM_LIMIT|WHE
186b0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d  RE_TOP_LIMIT))==
186c0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
186d0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
186e0 65 6e 64 28 70 53 74 72 2c 20 22 20 28 22 2c 20  end(pStr, " (", 
186f0 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  2);.  for(i=0; i
18700 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nEq; i++){.    
18710 63 68 61 72 20 2a 7a 20 3d 20 61 69 43 6f 6c 75  char *z = aiColu
18720 6d 6e 5b 69 5d 20 3c 20 30 20 3f 20 22 72 6f 77  mn[i] < 0 ? "row
18730 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c  id" : aCol[aiCol
18740 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[i]].zName;. 
18750 20 20 20 69 66 28 20 69 3e 3d 6e 53 6b 69 70 20     if( i>=nSkip 
18760 29 7b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  ){.      explain
18770 41 70 70 65 6e 64 54 65 72 6d 28 70 53 74 72 2c  AppendTerm(pStr,
18780 20 69 2c 20 7a 2c 20 22 3d 22 29 3b 0a 20 20 20   i, z, "=");.   
18790 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
187a0 28 20 69 20 29 20 73 71 6c 69 74 65 33 53 74 72  ( i ) sqlite3Str
187b0 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
187c0 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20  , " AND ", 5);. 
187d0 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
187e0 6e 74 66 28 70 53 74 72 2c 20 30 2c 20 22 41 4e  ntf(pStr, 0, "AN
187f0 59 28 25 73 29 22 2c 20 7a 29 3b 0a 20 20 20 20  Y(%s)", z);.    
18800 7d 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a  }.  }..  j = i;.
18810 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
18820 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c  lags&WHERE_BTM_L
18830 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72  IMIT ){.    char
18840 20 2a 7a 20 3d 20 61 69 43 6f 6c 75 6d 6e 5b 6a   *z = aiColumn[j
18850 5d 20 3c 20 30 20 3f 20 22 72 6f 77 69 64 22 20  ] < 0 ? "rowid" 
18860 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  : aCol[aiColumn[
18870 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65  j]].zName;.    e
18880 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
18890 28 70 53 74 72 2c 20 69 2b 2b 2c 20 7a 2c 20 22  (pStr, i++, z, "
188a0 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  >");.  }.  if( p
188b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48  Loop->wsFlags&WH
188c0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b  ERE_TOP_LIMIT ){
188d0 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61  .    char *z = a
188e0 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3c 20 30 20 3f  iColumn[j] < 0 ?
188f0 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b   "rowid" : aCol[
18900 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
18910 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41  me;.    explainA
18920 70 70 65 6e 64 54 65 72 6d 28 70 53 74 72 2c 20  ppendTerm(pStr, 
18930 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a  i, z, "<");.  }.
18940 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
18950 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 29  mAppend(pStr, ")
18960 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ", 1);.}../*.** 
18970 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
18980 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
18990 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
189a0 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20  sing an EXPLAIN 
189b0 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f  QUERY PLAN.** co
189c0 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 71 75  mmand. If the qu
189d0 65 72 79 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c  ery being compil
189e0 65 64 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  ed is an EXPLAIN
189f0 20 51 55 45 52 59 20 50 4c 41 4e 2c 20 61 20 73   QUERY PLAN, a s
18a00 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20  ingle.** record 
18a10 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
18a20 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72 69  output to descri
18a30 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63 61  be the table sca
18a40 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 0a 2a  n strategy in .*
18a50 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  * pLevel..*/.sta
18a60 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
18a70 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73 65  OneScan(.  Parse
18a80 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
18a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
18aa0 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
18ab0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
18ac0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
18ad0 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20 74   /* Table list t
18ae0 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73 20  his loop refers 
18af0 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  to */.  WhereLev
18b00 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20  el *pLevel,     
18b10 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20          /* Scan 
18b20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70 6c  to write OP_Expl
18b30 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a  ain opcode for *
18b40 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
18b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b60 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
18b70 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20   "level" column 
18b80 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  of output */.  i
18b90 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18bb0 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72 6f  * Value for "fro
18bc0 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74  m" column of out
18bd0 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  put */.  u16 wct
18be0 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  rlFlags         
18bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
18c00 73 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  s passed to sqli
18c10 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
18c20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
18c30 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
18c40 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
18c50 3d 3d 32 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b  ==2 ).#endif.  {
18c60 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
18c70 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
18c80 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
18c90 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
18ca0 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
18cb0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
18cc0 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e   /* VM being con
18cd0 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20  structed */.    
18ce0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
18cf0 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a  arse->db;     /*
18d00 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
18d10 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20   */.    int iId 
18d20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  = pParse->iSelec
18d30 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20  tId;  /* Select 
18d40 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75  id (left-most ou
18d50 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a  tput column) */.
18d60 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63 68      int isSearch
18d70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18d80 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
18d90 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f  SEARCH. False fo
18da0 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20 57  r SCAN. */.    W
18db0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18dd0 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  The controlling 
18de0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
18df0 20 2a 2f 0a 20 20 20 20 75 33 32 20 66 6c 61 67   */.    u32 flag
18e00 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
18e10 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
18e20 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68 69  hat describe thi
18e30 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 63 68  s loop */.    ch
18e40 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20  ar *zMsg;       
18e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18e60 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20 45 51  ext to add to EQ
18e70 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  P output */.    
18e80 53 74 72 41 63 63 75 6d 20 73 74 72 3b 20 20 20  StrAccum str;   
18e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18ea0 20 45 51 50 20 6f 75 74 70 75 74 20 73 74 72 69   EQP output stri
18eb0 6e 67 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a  ng */.    char z
18ec0 42 75 66 5b 31 30 30 5d 3b 20 20 20 20 20 20 20  Buf[100];       
18ed0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
18ee0 61 6c 20 73 70 61 63 65 20 66 6f 72 20 45 51 50  al space for EQP
18ef0 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67 20 2a   output string *
18f00 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  /..    pLoop = p
18f10 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
18f20 20 20 20 66 6c 61 67 73 20 3d 20 70 4c 6f 6f 70     flags = pLoop
18f30 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 69  ->wsFlags;.    i
18f40 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f  f( (flags&WHERE_
18f50 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63  MULTI_OR) || (wc
18f60 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
18f70 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29 20  NETABLE_ONLY) ) 
18f80 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 73 53  return;..    isS
18f90 65 61 72 63 68 20 3d 20 28 66 6c 61 67 73 26 28  earch = (flags&(
18fa0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c  WHERE_BTM_LIMIT|
18fb0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
18fc0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
18fd0 20 7c 7c 20 28 28 66 6c 61 67 73 26 57 48 45 52   || ((flags&WHER
18fe0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
18ff0 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e  =0 && (pLoop->u.
19000 62 74 72 65 65 2e 6e 45 71 3e 30 29 29 0a 20 20  btree.nEq>0)).  
19010 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63            || (wc
19020 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f  trlFlags&(WHERE_
19030 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52  ORDERBY_MIN|WHER
19040 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 29 3b  E_ORDERBY_MAX));
19050 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72  ..    sqlite3Str
19060 41 63 63 75 6d 49 6e 69 74 28 26 73 74 72 2c 20  AccumInit(&str, 
19070 7a 42 75 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75  zBuf, sizeof(zBu
19080 66 29 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  f), SQLITE_MAX_L
19090 45 4e 47 54 48 29 3b 0a 20 20 20 20 73 74 72 2e  ENGTH);.    str.
190a0 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c  db = db;.    sql
190b0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
190c0 6e 64 41 6c 6c 28 26 73 74 72 2c 20 69 73 53 65  ndAll(&str, isSe
190d0 61 72 63 68 20 3f 20 22 53 45 41 52 43 48 22 20  arch ? "SEARCH" 
190e0 3a 20 22 53 43 41 4e 22 29 3b 0a 20 20 20 20 69  : "SCAN");.    i
190f0 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
19100 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
19110 65 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20  e3XPrintf(&str, 
19120 30 2c 20 22 20 53 55 42 51 55 45 52 59 20 25 64  0, " SUBQUERY %d
19130 22 2c 20 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63  ", pItem->iSelec
19140 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tId);.    }else{
19150 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
19160 72 69 6e 74 66 28 26 73 74 72 2c 20 30 2c 20 22  rintf(&str, 0, "
19170 20 54 41 42 4c 45 20 25 73 22 2c 20 70 49 74 65   TABLE %s", pIte
19180 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  m->zName);.    }
19190 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ..    if( pItem-
191a0 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
191b0 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
191c0 26 73 74 72 2c 20 30 2c 20 22 20 41 53 20 25 73  &str, 0, " AS %s
191d0 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  ", pItem->zAlias
191e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
191f0 20 28 66 6c 61 67 73 20 26 20 28 57 48 45 52 45   (flags & (WHERE
19200 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49 52 54 55  _IPK|WHERE_VIRTU
19210 41 4c 54 41 42 4c 45 29 29 3d 3d 30 20 29 7b 0a  ALTABLE))==0 ){.
19220 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
19230 20 2a 7a 46 6d 74 20 3d 20 30 3b 0a 20 20 20 20   *zFmt = 0;.    
19240 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 0a    Index *pIdx;..
19250 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
19260 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
19270 64 65 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  dex!=0 );.      
19280 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  pIdx = pLoop->u.
19290 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
192a0 20 20 20 20 61 73 73 65 72 74 28 20 21 28 66 6c      assert( !(fl
192b0 61 67 73 26 57 48 45 52 45 5f 41 55 54 4f 5f 49  ags&WHERE_AUTO_I
192c0 4e 44 45 58 29 20 7c 7c 20 28 66 6c 61 67 73 26  NDEX) || (flags&
192d0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20  WHERE_IDX_ONLY) 
192e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 48 61  );.      if( !Ha
192f0 73 52 6f 77 69 64 28 70 49 74 65 6d 2d 3e 70 54  sRowid(pItem->pT
19300 61 62 29 20 26 26 20 49 73 50 72 69 6d 61 72 79  ab) && IsPrimary
19310 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 29  KeyIndex(pIdx) )
19320 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  {.        if( is
19330 53 65 61 72 63 68 20 29 7b 0a 20 20 20 20 20 20  Search ){.      
19340 20 20 20 20 7a 46 6d 74 20 3d 20 22 50 52 49 4d      zFmt = "PRIM
19350 41 52 59 20 4b 45 59 22 3b 0a 20 20 20 20 20 20  ARY KEY";.      
19360 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
19370 69 66 28 20 66 6c 61 67 73 20 26 20 57 48 45 52  if( flags & WHER
19380 45 5f 41 55 54 4f 5f 49 4e 44 45 58 20 29 7b 0a  E_AUTO_INDEX ){.
19390 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 22          zFmt = "
193a0 41 55 54 4f 4d 41 54 49 43 20 43 4f 56 45 52 49  AUTOMATIC COVERI
193b0 4e 47 20 49 4e 44 45 58 22 3b 0a 20 20 20 20 20  NG INDEX";.     
193c0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
193d0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
193e0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d  Y ){.        zFm
193f0 74 20 3d 20 22 43 4f 56 45 52 49 4e 47 20 49 4e  t = "COVERING IN
19400 44 45 58 20 25 73 22 3b 0a 20 20 20 20 20 20 7d  DEX %s";.      }
19410 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 46  else{.        zF
19420 6d 74 20 3d 20 22 49 4e 44 45 58 20 25 73 22 3b  mt = "INDEX %s";
19430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
19440 66 28 20 7a 46 6d 74 20 29 7b 0a 20 20 20 20 20  f( zFmt ){.     
19450 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
19460 75 6d 41 70 70 65 6e 64 28 26 73 74 72 2c 20 22  umAppend(&str, "
19470 20 55 53 49 4e 47 20 22 2c 20 37 29 3b 0a 20 20   USING ", 7);.  
19480 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
19490 69 6e 74 66 28 26 73 74 72 2c 20 30 2c 20 7a 46  intf(&str, 0, zF
194a0 6d 74 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  mt, pIdx->zName)
194b0 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ;.        explai
194c0 6e 49 6e 64 65 78 52 61 6e 67 65 28 26 73 74 72  nIndexRange(&str
194d0 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e  , pLoop, pItem->
194e0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pTab);.      }. 
194f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c     }else if( (fl
19500 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29  ags & WHERE_IPK)
19510 21 3d 30 20 26 26 20 28 66 6c 61 67 73 20 26 20  !=0 && (flags & 
19520 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54  WHERE_CONSTRAINT
19530 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )!=0 ){.      co
19540 6e 73 74 20 63 68 61 72 20 2a 7a 52 61 6e 67 65  nst char *zRange
19550 3b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  ;.      if( flag
19560 73 26 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  s&(WHERE_COLUMN_
19570 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  EQ|WHERE_COLUMN_
19580 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  IN) ){.        z
19590 52 61 6e 67 65 20 3d 20 22 28 72 6f 77 69 64 3d  Range = "(rowid=
195a0 3f 29 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ?)";.      }else
195b0 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52   if( (flags&WHER
195c0 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57  E_BOTH_LIMIT)==W
195d0 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20  HERE_BOTH_LIMIT 
195e0 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 61 6e 67  ){.        zRang
195f0 65 20 3d 20 22 28 72 6f 77 69 64 3e 3f 20 41 4e  e = "(rowid>? AN
19600 44 20 72 6f 77 69 64 3c 3f 29 22 3b 0a 20 20 20  D rowid<?)";.   
19610 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61     }else if( fla
19620 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  gs&WHERE_BTM_LIM
19630 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52  IT ){.        zR
19640 61 6e 67 65 20 3d 20 22 28 72 6f 77 69 64 3e 3f  ange = "(rowid>?
19650 29 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  )";.      }else{
19660 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
19670 20 66 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50   flags&WHERE_TOP
19680 5f 4c 49 4d 49 54 29 3b 0a 20 20 20 20 20 20 20  _LIMIT);.       
19690 20 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f 77 69   zRange = "(rowi
196a0 64 3c 3f 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20  d<?)";.      }. 
196b0 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
196c0 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 73  ccumAppendAll(&s
196d0 74 72 2c 20 22 20 55 53 49 4e 47 20 49 4e 54 45  tr, " USING INTE
196e0 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
196f0 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
19700 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41  3StrAccumAppendA
19710 6c 6c 28 26 73 74 72 2c 20 7a 52 61 6e 67 65 29  ll(&str, zRange)
19720 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
19730 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
19740 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c 73  UALTABLE.    els
19750 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57  e if( (flags & W
19760 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
19770 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  E)!=0 ){.      s
19780 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 73  qlite3XPrintf(&s
19790 74 72 2c 20 30 2c 20 22 20 56 49 52 54 55 41 4c  tr, 0, " VIRTUAL
197a0 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a   TABLE INDEX %d:
197b0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
197c0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e         pLoop->u.
197d0 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 4c 6f  vtab.idxNum, pLo
197e0 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  op->u.vtab.idxSt
197f0 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  r);.    }.#endif
19800 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
19810 58 50 4c 41 49 4e 5f 45 53 54 49 4d 41 54 45 44  XPLAIN_ESTIMATED
19820 5f 52 4f 57 53 0a 20 20 20 20 69 66 28 20 70 4c  _ROWS.    if( pL
19830 6f 6f 70 2d 3e 6e 4f 75 74 3e 3d 31 30 20 29 7b  oop->nOut>=10 ){
19840 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
19850 72 69 6e 74 66 28 26 73 74 72 2c 20 30 2c 20 22  rintf(&str, 0, "
19860 20 28 7e 25 6c 6c 75 20 72 6f 77 73 29 22 2c 20   (~%llu rows)", 
19870 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49  sqlite3LogEstToI
19880 6e 74 28 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29  nt(pLoop->nOut))
19890 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
198a0 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
198b0 75 6d 41 70 70 65 6e 64 28 26 73 74 72 2c 20 22  umAppend(&str, "
198c0 20 28 7e 31 20 72 6f 77 29 22 2c 20 39 29 3b 0a   (~1 row)", 9);.
198d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
198e0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 53   zMsg = sqlite3S
198f0 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 73  trAccumFinish(&s
19900 74 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tr);.    sqlite3
19910 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
19920 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69  _Explain, iId, i
19930 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d  Level, iFrom, zM
19940 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
19950 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
19960 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65  efine explainOne
19970 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a  Scan(u,v,w,x,y,z
19980 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
19990 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
199a0 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  */.../*.** Gener
199b0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
199c0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c   start of the iL
199d0 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20  evel-th loop in 
199e0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
199f0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
19a00 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
19a10 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69  pWInfo..*/.stati
19a20 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e  c Bitmask codeOn
19a30 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68  eLoopStart(.  Wh
19a40 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
19a50 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69     /* Complete i
19a60 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
19a70 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
19a80 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  e */.  int iLeve
19a90 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l,          /* W
19aa0 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57  hich level of pW
19ab0 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64  Info->a[] should
19ac0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 42   be coded */.  B
19ad0 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
19ae0 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62      /* Which tab
19af0 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  les are currentl
19b00 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29  y available */.)
19b10 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20  {.  int j, k;   
19b20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
19b30 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
19b40 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
19b50 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
19b60 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74  cursor for the t
19b70 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  able */.  int ad
19b80 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f  drNxt;         /
19b90 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
19ba0 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
19bb0 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73   the next IN cas
19bc0 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54  e */.  int omitT
19bd0 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  able;       /* T
19be0 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68  rue if we use th
19bf0 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a  e index only */.
19c00 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20    int bRev;     
19c10 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
19c20 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61  f we need to sca
19c30 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
19c40 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  er */.  WhereLev
19c50 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20  el *pLevel;  /* 
19c60 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20  The where level 
19c70 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
19c80 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
19c90 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  p;    /* The Whe
19ca0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65  reLoop object be
19cb0 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57  ing coded */.  W
19cc0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
19cd0 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69      /* Decomposi
19ce0 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69  tion of the enti
19cf0 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  re WHERE clause 
19d00 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
19d10 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
19d20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20       /* A WHERE 
19d30 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
19d40 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
19d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d60 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
19d70 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
19d80 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
19d90 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
19da0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
19db0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dd0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
19de0 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20  ared stmt under 
19df0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f  constructions */
19e00 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
19e10 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
19e20 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73  ;  /* FROM claus
19e30 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64  e term being cod
19e40 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
19e50 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  Brk;            
19e60 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
19e70 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  here to break ou
19e80 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  t of the loop */
19e90 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b  .  int addrCont;
19ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19eb0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
19ec0 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
19ed0 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20   next cycle */. 
19ee0 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d   int iRowidReg =
19ef0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f   0;        /* Ro
19f00 77 69 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e  wid is stored in
19f10 20 74 68 69 73 20 72 65 67 69 73 74 65 72 2c 20   this register, 
19f20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20  if not zero */. 
19f30 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67   int iReleaseReg
19f40 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65   = 0;      /* Te
19f50 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
19f60 72 65 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ree before retur
19f70 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73  ning */..  pPars
19f80 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
19f90 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  se;.  v = pParse
19fa0 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d  ->pVdbe;.  pWC =
19fb0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
19fc0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
19fd0 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57  ;.  pLevel = &pW
19fe0 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b  Info->a[iLevel];
19ff0 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
1a000 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61  l->pWLoop;.  pTa
1a010 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d  bItem = &pWInfo-
1a020 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
1a030 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69  vel->iFrom];.  i
1a040 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
1a050 69 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65 76 65  iCursor;.  pLeve
1a060 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20 6e 6f  l->notReady = no
1a070 74 52 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73  tReady & ~getMas
1a080 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
1a090 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 62 52  Set, iCur);.  bR
1a0a0 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65  ev = (pWInfo->re
1a0b0 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31  vMask>>iLevel)&1
1a0c0 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20  ;.  omitTable = 
1a0d0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1a0e0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
1a0f0 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )!=0 .          
1a100 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
1a110 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1a120 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b  FORCE_TABLE)==0;
1a130 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d  .  VdbeModuleCom
1a140 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20  ment((v, "Begin 
1a150 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73  WHERE-loop%d: %s
1a160 22 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49 74 65  ",iLevel,pTabIte
1a170 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
1a180 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c  ;..  /* Create l
1a190 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62  abels for the "b
1a1a0 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69  reak" and "conti
1a1b0 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  nue" instruction
1a1c0 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63  s.  ** for the c
1a1d0 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75  urrent loop.  Ju
1a1e0 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f  mp to addrBrk to
1a1f0 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20   break out of a 
1a200 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20  loop..  ** Jump 
1a210 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d  to cont to go im
1a220 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65  mediately to the
1a230 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
1a240 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70  of the.  ** loop
1a250 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
1a260 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20   there is an IN 
1a270 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73  operator, we als
1a280 6f 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78  o have a "addrNx
1a290 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20  t" label that.  
1a2a0 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74  ** means to cont
1a2b0 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
1a2c0 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62  xt IN value comb
1a2d0 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20  ination.  When. 
1a2e0 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f   ** there are no
1a2f0 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e   IN operators in
1a300 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
1a310 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20  , the "addrNxt" 
1a320 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68  label.  ** is th
1a330 65 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42  e same as "addrB
1a340 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72  rk"..  */.  addr
1a350 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Brk = pLevel->ad
1a360 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
1a370 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65  addrNxt = sqlite
1a380 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1a390 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20  );.  addrCont = 
1a3a0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
1a3b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1a3c0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
1a3d0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1a3e0 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
1a3f0 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
1a400 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a  N, allocate and.
1a410 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
1a420 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68  a memory cell th
1a430 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68  at records if th
1a440 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73  is table matches
1a450 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   any.  ** row of
1a460 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20   the left table 
1a470 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  of the join..  *
1a480 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  /.  if( pLevel->
1a490 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62  iFrom>0 && (pTab
1a4a0 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65  Item[0].jointype
1a4b0 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
1a4c0 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c  {.    pLevel->iL
1a4d0 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72  eftJoin = ++pPar
1a4e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
1a4f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a500 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
1a510 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
1a520 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  oin);.    VdbeCo
1a530 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20  mment((v, "init 
1a540 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74  LEFT JOIN no-mat
1a550 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a  ch flag"));.  }.
1a560 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
1a570 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  se of a FROM cla
1a580 75 73 65 20 73 75 62 71 75 65 72 79 20 69 6d 70  use subquery imp
1a590 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f  lemented as a co
1a5a0 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66  -routine */.  if
1a5b0 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43  ( pTabItem->viaC
1a5c0 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
1a5d0 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70  int regYield = p
1a5e0 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  TabItem->regRetu
1a5f0 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  rn;.    sqlite3V
1a600 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1a610 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
1a620 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62  egYield, 0, pTab
1a630 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
1a640 62 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  b);.    pLevel->
1a650 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62  p2 =  sqlite3Vdb
1a660 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1a670 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 2c 20 61  eld, regYield, a
1a680 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 56 64 62  ddrBrk);.    Vdb
1a690 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a6a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1a6b0 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 5c  , "next row of \
1a6c0 22 25 73 5c 22 22 2c 20 70 54 61 62 49 74 65 6d  "%s\"", pTabItem
1a6d0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
1a6e0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1a6f0 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c  = OP_Goto;.  }el
1a700 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
1a710 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1a720 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 6f  ABLE.  if(  (pLo
1a730 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1a740 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1a750 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  )!=0 ){.    /* C
1a760 61 73 65 20 31 3a 20 20 54 68 65 20 74 61 62 6c  ase 1:  The tabl
1a770 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74  e is a virtual-t
1a780 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56  able.  Use the V
1a790 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74  Filter and VNext
1a7a0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1a7b0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
1a7c0 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
1a7d0 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50  int iReg;   /* P
1a7e0 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56  3 Value for OP_V
1a7f0 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  Filter */.    in
1a800 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a  t addrNotFound;.
1a810 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
1a820 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  int = pLoop->nLT
1a830 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  erm;..    sqlite
1a840 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1a850 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67  Parse);.    iReg
1a860 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1a870 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
1a880 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
1a890 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
1a8a0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
1a8b0 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  k;.    for(j=0; 
1a8c0 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  j<nConstraint; j
1a8d0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
1a8e0 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b  Target = iReg+j+
1a8f0 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  2;.      pTerm =
1a900 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1a910 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ];.      if( pTe
1a920 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rm==0 ) continue
1a930 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
1a940 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1a950 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  O_IN ){.        
1a960 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
1a970 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
1a980 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c  pLevel, j, bRev,
1a990 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20   iTarget);.     
1a9a0 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
1a9b0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
1a9c0 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
1a9d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a9e0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1a9f0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
1aa00 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
1aa10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1aa20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1aa30 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1aa40 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  r, pLoop->u.vtab
1aa50 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a  .idxNum, iReg);.
1aa60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1aa70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1aa80 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ger, nConstraint
1aa90 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73  , iReg+1);.    s
1aaa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1aab0 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20  (v, OP_VFilter, 
1aac0 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75  iCur, addrNotFou
1aad0 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20  nd, iReg,.      
1aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aaf0 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
1ab00 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  xStr,.          
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
1ab20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
1ab30 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20  ee ? P4_MPRINTF 
1ab40 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  : P4_STATIC);.  
1ab50 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1ab60 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  );.    pLoop->u.
1ab70 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
1ab80 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  0;.    for(j=0; 
1ab90 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26  j<nConstraint &&
1aba0 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20   j<16; j++){.   
1abb0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75     if( (pLoop->u
1abc0 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e  .vtab.omitMask>>
1abd0 6a 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20 20  j)&1 ){.        
1abe0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1abf0 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  el, pLoop->aLTer
1ac00 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m[j]);.      }. 
1ac10 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
1ac20 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a  >op = OP_VNext;.
1ac30 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
1ac40 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
1ac50 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
1ac60 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1ac70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1ac80 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
1ac90 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f  Parse, iReg, nCo
1aca0 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20  nstraint+2);.   
1acb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1acc0 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
1acd0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
1ace0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1acf0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69  UALTABLE */..  i
1ad00 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1ad10 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
1ad20 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d  =0.   && (pLoop-
1ad30 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
1ad40 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52  E_COLUMN_IN|WHER
1ad50 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30  E_COLUMN_EQ))!=0
1ad60 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  .  ){.    /* Cas
1ad70 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72  e 2:  We can dir
1ad80 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20  ectly reference 
1ad90 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69  a single row usi
1ada0 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20  ng an.    **    
1adb0 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63        equality c
1adc0 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
1add0 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
1ade0 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20  d.  Or.    **   
1adf0 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65         we refere
1ae00 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  nce multiple row
1ae10 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64  s using a "rowid
1ae20 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a   IN (...)".    *
1ae30 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  *          const
1ae40 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ruct..    */.   
1ae50 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
1ae60 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29  u.btree.nEq==1 )
1ae70 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c  ;.    pTerm = pL
1ae80 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a  oop->aLTerm[0];.
1ae90 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
1aea0 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  m!=0 );.    asse
1aeb0 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
1aec0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1aed0 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
1aee0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1aef0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1af00 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1af10 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65  ;.    iReleaseRe
1af20 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
1af30 65 6d 3b 0a 20 20 20 20 69 52 6f 77 69 64 52 65  em;.    iRowidRe
1af40 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  g = codeEquality
1af50 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
1af60 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62  rm, pLevel, 0, b
1af70 52 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67  Rev, iReleaseReg
1af80 29 3b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69  );.    if( iRowi
1af90 64 52 65 67 21 3d 69 52 65 6c 65 61 73 65 52 65  dReg!=iReleaseRe
1afa0 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61  g ) sqlite3Relea
1afb0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1afc0 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a  , iReleaseReg);.
1afd0 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c      addrNxt = pL
1afe0 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
1aff0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b000 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
1b010 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c  eInt, iRowidReg,
1b020 20 61 64 64 72 4e 78 74 29 3b 20 56 64 62 65 43   addrNxt); VdbeC
1b030 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1b040 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b050 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  3(v, OP_NotExist
1b060 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74  s, iCur, addrNxt
1b070 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1b080 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1b090 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1b0a0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1b0b0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52  hange(pParse, iR
1b0c0 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20 20 20  owidReg, 1);.   
1b0d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1b0e0 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1b0f0 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
1b100 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  eg);.    VdbeCom
1b110 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
1b120 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1b130 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c  = OP_Noop;.  }el
1b140 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  se if( (pLoop->w
1b150 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1b160 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  PK)!=0.         
1b170 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
1b180 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
1b190 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29 7b  N_RANGE)!=0.  ){
1b1a0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20  .    /* Case 3: 
1b1b0 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71   We have an ineq
1b1c0 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
1b1d0 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
1b1e0 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a  WID field..    *
1b1f0 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70  /.    int testOp
1b200 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
1b210 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69  int start;.    i
1b220 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d  nt memEndValue =
1b230 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72   0;.    WhereTer
1b240 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64  m *pStart, *pEnd
1b250 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ;..    assert( o
1b260 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
1b270 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70 53     j = 0;.    pS
1b280 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20 30 3b  tart = pEnd = 0;
1b290 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1b2a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1b2b0 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74 61  BTM_LIMIT ) pSta
1b2c0 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rt = pLoop->aLTe
1b2d0 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28  rm[j++];.    if(
1b2e0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1b2f0 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
1b300 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f 70  T ) pEnd = pLoop
1b310 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20  ->aLTerm[j++];. 
1b320 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72     assert( pStar
1b330 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20  t!=0 || pEnd!=0 
1b340 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20  );.    if( bRev 
1b350 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  ){.      pTerm =
1b360 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70   pStart;.      p
1b370 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20  Start = pEnd;.  
1b380 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d      pEnd = pTerm
1b390 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b3a0 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  pStart ){.      
1b3b0 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
1b3c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
1b3d0 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66  ression that def
1b3e0 69 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62  ines the start b
1b3f0 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ound */.      in
1b400 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20  t r1, rTemp;    
1b410 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
1b420 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65   for holding the
1b430 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20   start boundary 
1b440 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  */..      /* The
1b450 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74   following const
1b460 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63  ant maps TK_xx c
1b470 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73  odes into corres
1b480 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a  ponding .      *
1b490 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20  * seek opcodes. 
1b4a0 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61   It depends on a
1b4b0 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65   particular orde
1b4c0 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20  ring of TK_xx.  
1b4d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e      */.      con
1b4e0 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20  st u8 aMoveOp[] 
1b4f0 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f  = {.           /
1b500 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53  * TK_GT */  OP_S
1b510 65 65 6b 47 54 2c 0a 20 20 20 20 20 20 20 20 20  eekGT,.         
1b520 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f    /* TK_LE */  O
1b530 50 5f 53 65 65 6b 4c 45 2c 0a 20 20 20 20 20 20  P_SeekLE,.      
1b540 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f       /* TK_LT */
1b550 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 0a 20 20 20    OP_SeekLT,.   
1b560 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45          /* TK_GE
1b570 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 45 0a 20   */  OP_SeekGE. 
1b580 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73       };.      as
1b590 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f  sert( TK_LE==TK_
1b5a0 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+1 );      /* 
1b5b0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72  Make sure the or
1b5c0 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20  dering.. */.    
1b5d0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
1b5e0 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20  =TK_GT+2 );     
1b5f0 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20   /*  ... of the 
1b600 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20  TK_xx values... 
1b610 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1b620 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20   TK_GE==TK_GT+3 
1b630 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
1b640 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a  is correcct. */.
1b650 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
1b660 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
1b670 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
1b680 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1b690 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c  se( pStart->wtFl
1b6a0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1b6b0 41 4c 20 29 3b 0a 20 20 20 20 20 20 70 58 20 3d  AL );.      pX =
1b6c0 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a   pStart->pExpr;.
1b6d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
1b6e0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  !=0 );.      tes
1b6f0 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 6c  tcase( pStart->l
1b700 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20  eftCursor!=iCur 
1b710 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69 76 65  ); /* transitive
1b720 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
1b730 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1b740 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1b750 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
1b760 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20  t, &rTemp);.    
1b770 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b780 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70  Op3(v, aMoveOp[p
1b790 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43  X->op-TK_GT], iC
1b7a0 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29  ur, addrBrk, r1)
1b7b0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1b7c0 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
1b7d0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b7e0 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d  geIf(v, pX->op==
1b7f0 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56 64  TK_GT);.      Vd
1b800 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1b810 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a  pX->op==TK_LE);.
1b820 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b830 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d  geIf(v, pX->op==
1b840 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56 64  TK_LT);.      Vd
1b850 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1b860 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a  pX->op==TK_GE);.
1b870 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b880 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1b890 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
1b8a0 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
1b8b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1b8c0 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b  (pParse, rTemp);
1b8d0 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
1b8e0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72  rm(pLevel, pStar
1b8f0 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
1b900 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b910 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f  AddOp2(v, bRev ?
1b920 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
1b930 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72  wind, iCur, addr
1b940 42 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Brk);.      Vdbe
1b950 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
1b960 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64  ev==0);.      Vd
1b970 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1b980 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 7d 0a  bRev!=0);.    }.
1b990 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a      if( pEnd ){.
1b9a0 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
1b9b0 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d        pX = pEnd-
1b9c0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
1b9d0 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
1b9e0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45       assert( (pE
1b9f0 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
1ba00 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
1ba10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ba20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pEnd->leftCursor
1ba30 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72 61  !=iCur ); /* Tra
1ba40 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69  nsitive constrai
1ba50 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  nts */.      tes
1ba60 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46  tcase( pEnd->wtF
1ba70 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1ba80 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  UAL );.      mem
1ba90 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61  EndValue = ++pPa
1baa0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1bab0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bac0 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
1bad0 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65  ght, memEndValue
1bae0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d  );.      if( pX-
1baf0 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58  >op==TK_LT || pX
1bb00 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20  ->op==TK_GT ){. 
1bb10 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
1bb20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f  bRev ? OP_Le : O
1bb30 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  P_Ge;.      }els
1bb40 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  e{.        testO
1bb50 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74  p = bRev ? OP_Lt
1bb60 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20   : OP_Gt;.      
1bb70 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54  }.      disableT
1bb80 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64  erm(pLevel, pEnd
1bb90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61  );.    }.    sta
1bba0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
1bbb0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1bbc0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1bbd0 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20   bRev ? OP_Prev 
1bbe0 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70  : OP_Next;.    p
1bbf0 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
1bc00 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
1bc10 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73   = start;.    as
1bc20 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
1bc30 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74  ==0 );.    if( t
1bc40 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
1bc50 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
1bc60 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
1bc70 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
1bc80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1bc90 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69  P_Rowid, iCur, i
1bca0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1bcb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1bcc0 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1bcd0 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
1bce0 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1bcf0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1bd00 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61  testOp, memEndVa
1bd10 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52  lue, addrBrk, iR
1bd20 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1bd30 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1bd40 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 65 29  , testOp==OP_Le)
1bd50 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1bd60 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70  rageIf(v, testOp
1bd70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
1bd80 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1bd90 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 65 29  , testOp==OP_Ge)
1bda0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1bdb0 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70  rageIf(v, testOp
1bdc0 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
1bdd0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1bde0 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46  eP5(v, SQLITE_AF
1bdf0 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49  F_NUMERIC | SQLI
1be00 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1be10 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1be20 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1be30 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
1be40 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1be50 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20  4: A scan using 
1be60 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  an index..    **
1be70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1be80 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1be90 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72   may contain zer
1bea0 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69  o or more equali
1beb0 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ty .    **      
1bec0 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f     terms ("==" o
1bed0 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  r "IN" operators
1bee0 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  ) that refer to 
1bef0 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20  the N.    **    
1bf00 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63       left-most c
1bf10 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
1bf20 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f  dex. It may also
1bf30 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20   contain.    ** 
1bf40 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69          inequali
1bf50 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28  ty constraints (
1bf60 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20  >, <, >= or <=) 
1bf70 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20  on the indexed. 
1bf80 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
1bf90 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69  lumn that immedi
1bfa0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68  ately follows th
1bfb0 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20  e N equalities. 
1bfc0 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  Only .    **    
1bfd0 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d       the right-m
1bfe0 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  ost column can b
1bff0 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  e an inequality 
1c000 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a  - the rest must.
1c010 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75      **         u
1c020 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20  se the "==" and 
1c030 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20  "IN" operators. 
1c040 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
1c050 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  the .    **     
1c060 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20      index is on 
1c070 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68  (x,y,z), then th
1c080 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75  e following clau
1c090 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20  ses are all .   
1c0a0 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69   **         opti
1c0b0 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20  mized:.    **.  
1c0c0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1c0d0 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  x=5.    **      
1c0e0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
1c0f0 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1c100 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31       x=5 AND y<1
1c110 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
1c120 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20      x=5 AND y>5 
1c130 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
1c140 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1c150 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30  ND y=5 AND z<=10
1c160 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1c170 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20         The z<10 
1c180 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c  term of the foll
1c190 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20  owing cannot be 
1c1a0 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a  used, only.    *
1c1b0 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d  *         the x=
1c1c0 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20  5 term:.    **. 
1c1d0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1c1e0 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20   x=5 AND z<10.  
1c1f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1c200 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72      N may be zer
1c210 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  o if there are i
1c220 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1c230 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20  aints..    **   
1c240 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61        If there a
1c250 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79  re no inequality
1c260 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
1c270 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a  en N is at.    *
1c280 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20  *         least 
1c290 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  one..    **.    
1c2a0 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20  **         This 
1c2b0 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65  case is also use
1c2c0 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  d when there are
1c2d0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
1c2e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1c2f0 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20  constraints but 
1c300 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65  an index is sele
1c310 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20  cted anyway, in 
1c320 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20  order.    **    
1c330 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68       to force th
1c340 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74  e output order t
1c350 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20  o conform to an 
1c360 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f  ORDER BY..    */
1c370 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f    .    static co
1c380 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b  nst u8 aStartOp[
1c390 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20  ] = {.      0,. 
1c3a0 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50       0,.      OP
1c3b0 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20  _Rewind,        
1c3c0 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74     /* 2: (!start
1c3d0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1c3e0 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65  startEq &&  !bRe
1c3f0 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c  v) */.      OP_L
1c400 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ast,            
1c410 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63   /* 3: (!start_c
1c420 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74  onstraints && st
1c430 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29  artEq &&   bRev)
1c440 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
1c450 6b 47 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kGT,           /
1c460 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 4: (start_cons
1c470 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61  traints  && !sta
1c480 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a  rtEq && !bRev) *
1c490 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c  /.      OP_SeekL
1c4a0 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  T,           /* 
1c4b0 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  5: (start_constr
1c4c0 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74  aints  && !start
1c4d0 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a  Eq &&  bRev) */.
1c4e0 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 45 2c        OP_SeekGE,
1c4f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a             /* 6:
1c500 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
1c510 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71  nts  &&  startEq
1c520 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
1c530 20 20 20 20 4f 50 5f 53 65 65 6b 4c 45 20 20 20      OP_SeekLE   
1c540 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28           /* 7: (
1c550 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1c560 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26  s  &&  startEq &
1c570 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
1c580 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  };.    static co
1c590 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20  nst u8 aEndOp[] 
1c5a0 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 49 64 78  = {.      OP_Idx
1c5b0 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  GE,            /
1c5c0 2a 20 30 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 0: (end_constr
1c5d0 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 20 26  aints && !bRev &
1c5e0 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20  & !endEq) */.   
1c5f0 20 20 20 4f 50 5f 49 64 78 47 54 2c 20 20 20 20     OP_IdxGT,    
1c600 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65          /* 1: (e
1c610 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  nd_constraints &
1c620 26 20 21 62 52 65 76 20 26 26 20 20 65 6e 64 45  & !bRev &&  endE
1c630 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  q) */.      OP_I
1c640 64 78 4c 45 2c 20 20 20 20 20 20 20 20 20 20 20  dxLE,           
1c650 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 2: (end_cons
1c660 74 72 61 69 6e 74 73 20 26 26 20 20 62 52 65 76  traints &&  bRev
1c670 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20   && !endEq) */. 
1c680 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 2c 20 20       OP_IdxLT,  
1c690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20            /* 3: 
1c6a0 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
1c6b0 20 26 26 20 20 62 52 65 76 20 26 26 20 20 65 6e   &&  bRev &&  en
1c6c0 64 45 71 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  dEq) */.    };. 
1c6d0 20 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f     u16 nEq = pLo
1c6e0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
1c6f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c700 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73  f == or IN terms
1c710 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42   */.    int regB
1c720 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1c730 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
1c740 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
1c750 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20  nstraint values 
1c760 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1c770 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20   *pRangeStart = 
1c780 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74  0;  /* Inequalit
1c790 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
1c7a0 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20  range start */. 
1c7b0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
1c7c0 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20  angeEnd = 0;    
1c7d0 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
1c7e0 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
1c7f0 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74  e end */.    int
1c800 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20   startEq;       
1c810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1c820 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74  e if range start
1c830 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
1c840 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e  <= */.    int en
1c850 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  dEq;            
1c860 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1c870 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73  f range end uses
1c880 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
1c890 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63  .    int start_c
1c8a0 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20  onstraints;     
1c8b0 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61    /* Start of ra
1c8c0 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  nge is constrain
1c8d0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  ed */.    int nC
1c8e0 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20  onstraint;      
1c8f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c900 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74   of constraint t
1c910 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65  erms */.    Inde
1c920 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
1c930 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c940 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65  index we will be
1c950 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e   using */.    in
1c960 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20  t iIdxCur;      
1c970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c980 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
1c990 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  r the index */. 
1c9a0 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67     int nExtraReg
1c9b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1c9c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
1c9d0 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65  ra registers nee
1c9e0 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  ded */.    int o
1c9f0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1ca00 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72          /* Instr
1ca10 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  uction opcode */
1ca20 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72  .    char *zStar
1ca30 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  tAff;           
1ca40 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
1ca50 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65  r start of range
1ca60 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
1ca70 20 20 20 63 68 61 72 20 63 45 6e 64 41 66 66 20     char cEndAff 
1ca80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1ca90 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20  /* Affinity for 
1caa0 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e  end of range con
1cab0 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 75  straint */.    u
1cac0 38 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20  8 bSeekPastNull 
1cad0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
1cae0 72 75 65 20 74 6f 20 73 65 65 6b 20 70 61 73 74  rue to seek past
1caf0 20 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73 20 2a   initial nulls *
1cb00 2f 0a 20 20 20 20 75 38 20 62 53 74 6f 70 41 74  /.    u8 bStopAt
1cb10 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Null = 0;       
1cb20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64 69 74     /* Add condit
1cb30 69 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ion to terminate
1cb40 20 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a 20 20   at NULLs */..  
1cb50 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
1cb60 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
1cb70 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c      iIdxCur = pL
1cb80 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
1cb90 20 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d     assert( nEq>=
1cba0 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 3b 0a  pLoop->nSkip );.
1cbb0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1cbc0 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61  loop satisfies a
1cbd0 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72   sort order (pOr
1cbe0 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74  derBy) request t
1cbf0 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20  hat .    ** was 
1cc00 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1cc10 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65  unction to imple
1cc20 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d  ment a "SELECT m
1cc30 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20  in(x) ..." .    
1cc40 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74  ** query, then t
1cc50 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
1cc60 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f  nly allow the lo
1cc70 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20  op to run for.  
1cc80 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74    ** a single it
1cc90 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  eration. This me
1cca0 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72  ans that the fir
1ccb0 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a  st row returned.
1ccc0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f      ** should no
1ccd0 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61  t have a NULL va
1cce0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78  lue stored in 'x
1ccf0 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27  '. If column 'x'
1cd00 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66   is.    ** the f
1cd10 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74  irst one after t
1cd20 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20  he nEq equality 
1cd30 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
1cd40 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a  he index,.    **
1cd50 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73   this requires s
1cd60 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ome special hand
1cd70 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ling..    */.   
1cd80 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
1cd90 3e 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20 20 20  >pOrderBy==0.   
1cda0 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d        || pWInfo-
1cdb0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
1cdc0 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==1.         || 
1cdd0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
1cde0 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
1cdf0 59 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20  Y_MIN)==0 );.   
1ce00 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
1ce10 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
1ce20 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20  RDERBY_MIN)!=0. 
1ce30 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e      && pWInfo->n
1ce40 4f 42 53 61 74 3e 30 0a 20 20 20 20 20 26 26 20  OBSat>0.     && 
1ce50 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e  (pIdx->nKeyCol>n
1ce60 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
1ce70 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
1ce80 6e 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 20 20  nSkip==0 );.    
1ce90 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20    bSeekPastNull 
1cea0 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  = 1;.      nExtr
1ceb0 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
1cec0 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79  .    /* Find any
1ced0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1cee0 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72  traint terms for
1cef0 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65   the start and e
1cf00 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nd .    ** of th
1cf10 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f  e range. .    */
1cf20 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20  .    j = nEq;.  
1cf30 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
1cf40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
1cf50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
1cf60 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c  pRangeStart = pL
1cf70 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
1cf80 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
1cf90 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 1;.    }.   
1cfa0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1cfb0 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
1cfc0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
1cfd0 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f 6f 70  RangeEnd = pLoop
1cfe0 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20  ->aLTerm[j++];. 
1cff0 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
1d000 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52   1;.      if( pR
1d010 61 6e 67 65 53 74 61 72 74 3d 3d 30 0a 20 20 20  angeStart==0.   
1d020 20 20 20 20 26 26 20 28 6a 20 3d 20 70 49 64 78      && (j = pIdx
1d030 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29  ->aiColumn[nEq])
1d040 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  >=0 .       && p
1d050 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
1d060 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a  l[j].notNull==0.
1d070 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1d080 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d   bSeekPastNull =
1d090 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1d0a0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  }.    assert( pR
1d0b0 61 6e 67 65 45 6e 64 3d 3d 30 20 7c 7c 20 28 70  angeEnd==0 || (p
1d0c0 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67  RangeEnd->wtFlag
1d0d0 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
1d0e0 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  =0 );..    /* Ge
1d0f0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
1d100 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73  valuate all cons
1d110 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69  traint terms usi
1d120 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20  ng == or IN.    
1d130 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
1d140 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65   values of those
1d150 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72   terms in an arr
1d160 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ay of registers.
1d170 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
1d180 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20  at regBase..    
1d190 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  */.    regBase =
1d1a0 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
1d1b0 54 65 72 6d 73 28 70 50 61 72 73 65 2c 70 4c 65  Terms(pParse,pLe
1d1c0 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61 52  vel,bRev,nExtraR
1d1d0 65 67 2c 26 7a 53 74 61 72 74 41 66 66 29 3b 0a  eg,&zStartAff);.
1d1e0 20 20 20 20 61 73 73 65 72 74 28 20 7a 53 74 61      assert( zSta
1d1f0 72 74 41 66 66 3d 3d 30 20 7c 7c 20 73 71 6c 69  rtAff==0 || sqli
1d200 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 61  te3Strlen30(zSta
1d210 72 74 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20  rtAff)>=nEq );. 
1d220 20 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66     if( zStartAff
1d230 20 29 20 63 45 6e 64 41 66 66 20 3d 20 7a 53 74   ) cEndAff = zSt
1d240 61 72 74 41 66 66 5b 6e 45 71 5d 3b 0a 20 20 20  artAff[nEq];.   
1d250 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
1d260 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20  l->addrNxt;..   
1d270 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
1d280 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72  ing a reverse or
1d290 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61  der scan on an a
1d2a0 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20  scending index, 
1d2b0 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77  or.    ** a forw
1d2c0 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f  ard order scan o
1d2d0 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
1d2e0 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67  ndex, interchang
1d2f0 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74  e the .    ** st
1d300 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d  art and end term
1d310 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61  s (pRangeStart a
1d320 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20  nd pRangeEnd).. 
1d330 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e     */.    if( (n
1d340 45 71 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  Eq<pIdx->nKeyCol
1d350 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d   && bRev==(pIdx-
1d360 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
1d370 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29  ==SQLITE_SO_ASC)
1d380 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20  ).     || (bRev 
1d390 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  && pIdx->nKeyCol
1d3a0 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  ==nEq).    ){.  
1d3b0 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65      SWAP(WhereTe
1d3c0 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c  rm *, pRangeEnd,
1d3d0 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
1d3e0 20 20 20 20 20 53 57 41 50 28 75 38 2c 20 62 53       SWAP(u8, bS
1d3f0 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 62 53 74  eekPastNull, bSt
1d400 6f 70 41 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d  opAtNull);.    }
1d410 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ..    testcase( 
1d420 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28  pRangeStart && (
1d430 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
1d440 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21  erator & WO_LE)!
1d450 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
1d460 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
1d470 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d  && (pRangeStart-
1d480 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1d490 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  GE)!=0 );.    te
1d4a0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
1d4b0 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d  d && (pRangeEnd-
1d4c0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1d4d0 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  LE)!=0 );.    te
1d4e0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
1d4f0 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d  d && (pRangeEnd-
1d500 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1d510 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 74  GE)!=0 );.    st
1d520 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53  artEq = !pRangeS
1d530 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74  tart || pRangeSt
1d540 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
1d550 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
1d560 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70      endEq =   !p
1d570 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e  RangeEnd || pRan
1d580 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
1d590 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
1d5a0 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73  ;.    start_cons
1d5b0 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65  traints = pRange
1d5c0 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a  Start || nEq>0;.
1d5d0 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
1d5e0 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f   index cursor to
1d5f0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1d600 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
1d610 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
1d620 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
1d630 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  eStart ){.      
1d640 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
1d650 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70  RangeStart->pExp
1d660 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
1d670 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d680 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
1d690 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1d6a0 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
1d6b0 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
1d6c0 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a   TERM_VNULL)==0.
1d6d0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1d6e0 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
1d6f0 52 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a  Right).      ){.
1d700 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1d710 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d720 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b  IsNull, regBase+
1d730 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
1d740 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1d750 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  age(v);.      }.
1d760 20 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74        if( zStart
1d770 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
1d780 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
1d790 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
1d7a0 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d  , zStartAff[nEq]
1d7b0 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
1d7c0 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  NE){.          /
1d7d0 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70  * Since the comp
1d7e0 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20  arison is to be 
1d7f0 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e  performed with n
1d800 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20  o conversions.  
1d810 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69          ** appli
1d820 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e  ed to the operan
1d830 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69  ds, set the affi
1d840 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f  nity to apply to
1d850 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20   pRight to .    
1d860 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
1d870 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20  AFF_NONE.  */.  
1d880 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66          zStartAf
1d890 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
1d8a0 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
1d8b0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1d8c0 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
1d8d0 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
1d8e0 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41  (pRight, zStartA
1d8f0 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20  ff[nEq]) ){.    
1d900 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b        zStartAff[
1d910 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
1d920 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
1d930 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20  }.      }  .    
1d940 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
1d950 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d960 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74   pRangeStart->wt
1d970 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1d980 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73  TUAL );.    }els
1d990 65 20 69 66 28 20 62 53 65 65 6b 50 61 73 74 4e  e if( bSeekPastN
1d9a0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ull ){.      sql
1d9b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d9c0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
1d9d0 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
1d9e0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
1d9f0 0a 20 20 20 20 20 20 73 74 61 72 74 45 71 20 3d  .      startEq =
1da00 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f   0;.      start_
1da10 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b  constraints = 1;
1da20 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41  .    }.    codeA
1da30 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61  pplyAffinity(pPa
1da40 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
1da50 6f 6e 73 74 72 61 69 6e 74 20 2d 20 62 53 65 65  onstraint - bSee
1da60 6b 50 61 73 74 4e 75 6c 6c 2c 20 7a 53 74 61 72  kPastNull, zStar
1da70 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20  tAff);.    op = 
1da80 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f  aStartOp[(start_
1da90 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20  constraints<<2) 
1daa0 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b  + (startEq<<1) +
1dab0 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65   bRev];.    asse
1dac0 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20  rt( op!=0 );.   
1dad0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1dae0 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64  p4Int(v, op, iId
1daf0 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72  xCur, addrNxt, r
1db00 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
1db10 69 6e 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  int);.    VdbeCo
1db20 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56  verage(v);.    V
1db30 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1db40 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 29 3b   op==OP_Rewind);
1db50 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1db60 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20  OP_Rewind );.   
1db70 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1db80 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 29 3b  v, op==OP_Last);
1db90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1dba0 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20  ==OP_Last );.   
1dbb0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1dbc0 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54  v, op==OP_SeekGT
1dbd0 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  );  testcase( op
1dbe0 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 29 3b 0a 20  ==OP_SeekGT );. 
1dbf0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1dc00 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  f(v, op==OP_Seek
1dc10 47 45 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  GE);  testcase( 
1dc20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 29 3b  op==OP_SeekGE );
1dc30 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1dc40 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65  eIf(v, op==OP_Se
1dc50 65 6b 4c 45 29 3b 20 20 74 65 73 74 63 61 73 65  ekLE);  testcase
1dc60 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20  ( op==OP_SeekLE 
1dc70 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1dc80 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
1dc90 53 65 65 6b 4c 54 29 3b 20 20 74 65 73 74 63 61  SeekLT);  testca
1dca0 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  se( op==OP_SeekL
1dcb0 54 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  T );..    /* Loa
1dcc0 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  d the value for 
1dcd0 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
1dce0 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65  onstraint at the
1dcf0 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
1dd00 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79  ** range (if any
1dd10 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43  )..    */.    nC
1dd20 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
1dd30 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45  .    if( pRangeE
1dd40 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  nd ){.      Expr
1dd50 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67   *pRight = pRang
1dd60 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69  eEnd->pExpr->pRi
1dd70 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
1dd80 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
1dd90 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
1dda0 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20  e+nEq, 1);.     
1ddb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ddc0 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
1ddd0 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1dde0 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
1ddf0 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1de00 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20  ERM_VNULL)==0.  
1de10 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
1de20 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69  xprCanBeNull(pRi
1de30 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  ght).      ){.  
1de40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1de50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
1de60 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45  Null, regBase+nE
1de70 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  q, addrNxt);.   
1de80 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1de90 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e(v);.      }.  
1dea0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
1deb0 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
1dec0 52 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29 21  Right, cEndAff)!
1ded0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
1dee0 0a 20 20 20 20 20 20 20 26 26 20 21 73 71 6c 69  .       && !sqli
1def0 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
1df00 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
1df10 67 68 74 2c 20 63 45 6e 64 41 66 66 29 0a 20 20  ght, cEndAff).  
1df20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 63      ){.        c
1df30 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
1df40 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
1df50 2b 6e 45 71 2c 20 31 2c 20 26 63 45 6e 64 41 66  +nEq, 1, &cEndAf
1df60 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  f);.      }.    
1df70 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
1df80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1df90 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c   pRangeEnd->wtFl
1dfa0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1dfb0 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  AL );.    }else 
1dfc0 69 66 28 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20  if( bStopAtNull 
1dfd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1dfe0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1dff0 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73  _Null, 0, regBas
1e000 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 65 6e  e+nEq);.      en
1e010 64 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  dEq = 0;.      n
1e020 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
1e030 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
1e040 62 46 72 65 65 28 64 62 2c 20 7a 53 74 61 72 74  bFree(db, zStart
1e050 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f  Aff);..    /* To
1e060 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f  p of the loop bo
1e070 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c  dy */.    pLevel
1e080 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
1e090 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1e0a0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
1e0b0 69 66 20 74 68 65 20 69 6e 64 65 78 20 63 75 72  if the index cur
1e0c0 73 6f 72 20 69 73 20 70 61 73 74 20 74 68 65 20  sor is past the 
1e0d0 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  end of the range
1e0e0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 43 6f  . */.    if( nCo
1e0f0 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20  nstraint ){.    
1e100 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 62 52    op = aEndOp[bR
1e110 65 76 2a 32 20 2b 20 65 6e 64 45 71 5d 3b 0a 20  ev*2 + endEq];. 
1e120 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e130 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
1e140 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
1e150 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  t, regBase, nCon
1e160 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20  straint);.      
1e170 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1e180 5f 49 64 78 47 54 20 29 3b 20 20 56 64 62 65 43  _IdxGT );  VdbeC
1e190 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1e1a0 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20 20 20  =OP_IdxGT );.   
1e1b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1e1c0 3d 4f 50 5f 49 64 78 47 45 20 29 3b 20 20 56 64  =OP_IdxGE );  Vd
1e1d0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1e1e0 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a  op==OP_IdxGE );.
1e1f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e200 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 20  op==OP_IdxLT ); 
1e210 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e220 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20  v, op==OP_IdxLT 
1e230 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e240 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20  e( op==OP_IdxLE 
1e250 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
1e260 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78  If(v, op==OP_Idx
1e270 4c 45 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  LE );.    }..   
1e280 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62   /* Seek the tab
1e290 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65  le cursor, if re
1e2a0 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69  quired */.    di
1e2b0 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
1e2c0 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
1e2d0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1e2e0 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e  pLevel, pRangeEn
1e2f0 64 29 3b 0a 20 20 20 20 69 66 28 20 6f 6d 69 74  d);.    if( omit
1e300 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f  Table ){.      /
1e310 2a 20 70 49 64 78 20 69 73 20 61 20 63 6f 76 65  * pIdx is a cove
1e320 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 4e 6f 20  ring index.  No 
1e330 6e 65 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  need to access t
1e340 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 2a  he main table. *
1e350 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  /.    }else if( 
1e360 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70  HasRowid(pIdx->p
1e370 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  Table) ){.      
1e380 69 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b 70 50  iRowidReg = ++pP
1e390 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1e3a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e3b0 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  Op2(v, OP_IdxRow
1e3c0 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f  id, iIdxCur, iRo
1e3d0 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
1e3e0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
1e3f0 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75  tore(pParse, iCu
1e400 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67  r, -1, iRowidReg
1e410 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e420 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e430 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f  _Seek, iCur, iRo
1e440 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66  widReg);  /* Def
1e450 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20  erred seek */.  
1e460 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 75 72    }else if( iCur
1e470 21 3d 69 49 64 78 43 75 72 20 29 7b 0a 20 20 20  !=iIdxCur ){.   
1e480 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
1e490 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
1e4a0 79 49 6e 64 65 78 28 70 49 64 78 2d 3e 70 54 61  yIndex(pIdx->pTa
1e4b0 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 52 6f 77  ble);.      iRow
1e4c0 69 64 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  idReg = sqlite3G
1e4d0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
1e4e0 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  se, pPk->nKeyCol
1e4f0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
1e500 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  ; j<pPk->nKeyCol
1e510 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1e520 6b 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  k = sqlite3Colum
1e530 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 70  nOfIndex(pIdx, p
1e540 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29  Pk->aiColumn[j])
1e550 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1e560 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1e570 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
1e580 72 2c 20 6b 2c 20 69 52 6f 77 69 64 52 65 67 2b  r, k, iRowidReg+
1e590 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j);.      }.    
1e5a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e5b0 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
1e5c0 46 6f 75 6e 64 2c 20 69 43 75 72 2c 20 61 64 64  Found, iCur, add
1e5d0 72 43 6f 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  rCont,.         
1e5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5f0 20 20 69 52 6f 77 69 64 52 65 67 2c 20 70 50 6b    iRowidReg, pPk
1e600 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65  ->nKeyCol); Vdbe
1e610 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1e620 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72   }..    /* Recor
1e630 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  d the instructio
1e640 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e  n used to termin
1e650 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69  ate the loop. Di
1e660 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48  sable .    ** WH
1e670 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
1e680 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20   made redundant 
1e690 62 79 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e  by the index ran
1e6a0 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a  ge scan..    */.
1e6b0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1e6c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
1e6d0 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70  NEROW ){.      p
1e6e0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
1e6f0 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oop;.    }else i
1e700 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
1e710 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1e720 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65  _Prev;.    }else
1e730 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1e740 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
1e750 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
1e760 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  p1 = iIdxCur;.  
1e770 20 20 70 4c 65 76 65 6c 2d 3e 70 33 20 3d 20 28    pLevel->p3 = (
1e780 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57  pLoop->wsFlags&W
1e790 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 29  HERE_UNQ_WANTED)
1e7a0 21 3d 30 20 3f 20 31 3a 30 3b 0a 20 20 20 20 69  !=0 ? 1:0;.    i
1e7b0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1e7c0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54  gs & WHERE_CONST
1e7d0 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20  RAINT)==0 ){.   
1e7e0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20     pLevel->p5 = 
1e7f0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
1e800 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b  S_FULLSCAN_STEP;
1e810 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e820 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
1e830 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  ->p5==0 );.    }
1e840 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
1e850 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  f SQLITE_OMIT_OR
1e860 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
1e870 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1e880 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
1e890 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  _OR ){.    /* Ca
1e8a0 73 65 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d 6f  se 5:  Two or mo
1e8b0 72 65 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e  re separately in
1e8c0 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e  dexed terms conn
1e8d0 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20  ected by OR.    
1e8e0 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  **.    ** Exampl
1e8f0 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
1e900 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1e910 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20  t1(a,b,c,d);.   
1e920 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
1e930 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a  EX i1 ON t1(a);.
1e940 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
1e950 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62  INDEX i2 ON t1(b
1e960 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
1e970 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74  TE INDEX i3 ON t
1e980 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  1(c);.    **.   
1e990 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46   **   SELECT * F
1e9a0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35  ROM t1 WHERE a=5
1e9b0 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31   OR b=7 OR (c=11
1e9c0 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a   AND d=13).    *
1e9d0 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20  *.    ** In the 
1e9e0 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61  example, there a
1e9f0 72 65 20 74 68 72 65 65 20 69 6e 64 65 78 65 64  re three indexed
1ea00 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64   terms connected
1ea10 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54   by OR..    ** T
1ea20 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
1ea30 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  op looks like th
1ea40 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
1ea50 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20  *          Null 
1ea60 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
1ea70 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68         # Zero th
1ea80 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20  e rowset in reg 
1ea90 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  1.    **.    ** 
1eaa0 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69  Then, for each i
1eab0 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65  ndexed term, the
1eac0 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20   following. The 
1ead0 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
1eae0 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61   ** RowSetTest a
1eaf0 72 65 20 73 75 63 68 20 74 68 61 74 20 74 68 65  re such that the
1eb00 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75   rowid of the cu
1eb10 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73  rrent row is ins
1eb20 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74  erted.    ** int
1eb30 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66  o the RowSet. If
1eb40 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70   it is already p
1eb50 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20  resent, control 
1eb60 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a  skips the.    **
1eb70 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e   Gosub opcode an
1eb80 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74  d jumps straight
1eb90 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
1eba0 65 72 61 74 65 64 20 62 79 20 57 68 65 72 65 45  erated by WhereE
1ebb0 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  nd()..    **.   
1ebc0 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
1ebd0 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65  e3WhereBegin(<te
1ebe0 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20  rm>).    **     
1ebf0 20 20 20 20 20 52 6f 77 53 65 74 54 65 73 74 20       RowSetTest 
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec10 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20   # Insert rowid 
1ec20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20  into rowset.    
1ec30 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73 75  **          Gosu
1ec40 62 20 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a  b      2 A.    *
1ec50 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  *        sqlite3
1ec60 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a  WhereEnd().    *
1ec70 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69  *.    ** Followi
1ec80 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f  ng the above, co
1ec90 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  de to terminate 
1eca0 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20  the loop. Label 
1ecb0 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20 20  A, the target.  
1ecc0 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75    ** of the Gosu
1ecd0 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74  b above, jumps t
1ece0 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  o the instructio
1ecf0 6e 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  n right after th
1ed00 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20  e Goto..    **. 
1ed10 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
1ed20 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
1ed30 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
1ed40 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
1ed50 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20  reg 1.    **    
1ed60 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20        Goto      
1ed70 20 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20   B              
1ed80 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20    # The loop is 
1ed90 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a  finished..    **
1eda0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a  .    **       A:
1edb0 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20   <loop body>    
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 52               # R
1edd0 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74  eturn data, what
1ede0 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ever..    **.   
1edf0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65 74   **          Ret
1ee00 75 72 6e 20 20 20 20 20 32 20 20 20 20 20 20 20  urn     2       
1ee10 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20           # Jump 
1ee20 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75  back to the Gosu
1ee30 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  b.    **.    ** 
1ee40 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20        B: <after 
1ee50 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a  the loop>.    **
1ee60 0a 20 20 20 20 2a 2a 20 41 64 64 65 64 20 32 30  .    ** Added 20
1ee70 31 34 2d 30 35 2d 32 36 3a 20 49 66 20 74 68 65  14-05-26: If the
1ee80 20 74 61 62 6c 65 20 69 73 20 61 20 57 49 54 48   table is a WITH
1ee90 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c  OUT ROWID table,
1eea0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 75 73 65   then.    ** use
1eeb0 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
1eec0 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 61  dex instead of a
1eed0 20 52 6f 77 53 65 74 20 74 6f 20 72 65 63 6f 72   RowSet to recor
1eee0 64 20 74 68 65 20 70 72 69 6d 61 72 79 0a 20 20  d the primary.  
1eef0 20 20 2a 2a 20 6b 65 79 73 20 6f 66 20 74 68 65    ** keys of the
1ef00 20 72 6f 77 73 20 77 65 20 68 61 76 65 20 61 6c   rows we have al
1ef10 72 65 61 64 79 20 73 65 65 6e 2e 0a 20 20 20 20  ready seen..    
1ef20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68  **.    */.    Wh
1ef30 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
1ef40 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63  ;    /* The OR-c
1ef50 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74  lause broken out
1ef60 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
1ef70 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  /.    SrcList *p
1ef80 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20  OrTab;       /* 
1ef90 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20  Shortened table 
1efa0 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73  list or OR-claus
1efb0 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  e generation */.
1efc0 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 20      Index *pCov 
1efd0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1efe0 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f   /* Potential co
1eff0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f 72  vering index (or
1f000 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e   NULL) */.    in
1f010 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61 72  t iCovCur = pPar
1f020 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20  se->nTab++;  /* 
1f030 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  Cursor used for 
1f040 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66 20  index scans (if 
1f050 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74  any) */..    int
1f060 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70   regReturn = ++p
1f070 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
1f080 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
1f090 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f  er used with OP_
1f0a0 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74  Gosub */.    int
1f0b0 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20   regRowset = 0; 
1f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0d0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
1f0e0 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62  er for RowSet ob
1f0f0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ject */.    int 
1f100 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20  regRowid = 0;   
1f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f120 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1f130 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20  r holding rowid 
1f140 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70  */.    int iLoop
1f150 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64  Body = sqlite3Vd
1f160 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
1f170 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f   /* Start of loo
1f180 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e  p body */.    in
1f190 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20  t iRetInit;     
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1b0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1f1c0 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20  ss of regReturn 
1f1d0 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  init */.    int 
1f1e0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20  untestedTerms = 
1f1f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
1f200 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74  * Some terms not
1f210 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74   completely test
1f220 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  ed */.    int ii
1f230 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f250 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1f260 20 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61      u16 wctrlFla
1f270 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1f280 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
1f290 66 6f 72 20 73 75 62 2d 57 48 45 52 45 20 63 6c  for sub-WHERE cl
1f2a0 61 75 73 65 20 2a 2f 0a 20 20 20 20 45 78 70 72  ause */.    Expr
1f2b0 20 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20   *pAndExpr = 0; 
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f2d0 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e  * An ".. AND (..
1f2e0 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  .)" expression *
1f2f0 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  /.    Table *pTa
1f300 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
1f310 61 62 3b 0a 20 20 20 0a 20 20 20 20 70 54 65 72  ab;.   .    pTer
1f320 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  m = pLoop->aLTer
1f330 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  m[0];.    assert
1f340 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
1f350 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
1f360 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1f370 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OR );.    assert
1f380 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
1f390 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  s & TERM_ORINFO)
1f3a0 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63  !=0 );.    pOrWc
1f3b0 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
1f3c0 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c  Info->wc;.    pL
1f3d0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65  evel->op = OP_Re
1f3e0 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c  turn;.    pLevel
1f3f0 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72 6e  ->p1 = regReturn
1f400 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70  ;..    /* Set up
1f410 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
1f420 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e  n pOrTab contain
1f430 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62 65  ing the table be
1f440 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20 20  ing scanned.    
1f450 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20  ** by this loop 
1f460 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74  in the a[0] slot
1f470 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64   and all notRead
1f480 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e  y tables in a[1.
1f490 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a  .] slots..    **
1f4a0 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74 68   This becomes th
1f4b0 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68 65  e SrcList in the
1f4c0 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20   recursive call 
1f4d0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
1f4e0 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  egin()..    */. 
1f4f0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
1f500 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20  Level>1 ){.     
1f510 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20   int nNotReady; 
1f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f530 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
1f540 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73   notReady tables
1f550 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
1f560 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f   SrcList_item *o
1f570 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f  rigSrc;     /* O
1f580 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20  riginal list of 
1f590 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
1f5a0 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49 6e  nNotReady = pWIn
1f5b0 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65  fo->nLevel - iLe
1f5c0 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 70  vel - 1;.      p
1f5d0 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53  OrTab = sqlite3S
1f5e0 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c  tackAllocRaw(db,
1f5f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
1f610 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e  eof(*pOrTab)+ nN
1f620 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70  otReady*sizeof(p
1f630 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20  OrTab->a[0]));. 
1f640 20 20 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d       if( pOrTab=
1f650 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52  =0 ) return notR
1f660 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54  eady;.      pOrT
1f670 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38  ab->nAlloc = (u8
1f680 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29  )(nNotReady + 1)
1f690 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
1f6a0 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e  nSrc = pOrTab->n
1f6b0 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d  Alloc;.      mem
1f6c0 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70  cpy(pOrTab->a, p
1f6d0 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28  TabItem, sizeof(
1f6e0 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20  *pTabItem));.   
1f6f0 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49     origSrc = pWI
1f700 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
1f710 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b  ;.      for(k=1;
1f720 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b   k<=nNotReady; k
1f730 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ++){.        mem
1f740 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b  cpy(&pOrTab->a[k
1f750 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76  ], &origSrc[pLev
1f760 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69  el[k].iFrom], si
1f770 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b  zeof(pOrTab->a[k
1f780 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]));.      }.   
1f790 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f   }else{.      pO
1f7a0 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  rTab = pWInfo->p
1f7b0 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a  TabList;.    }..
1f7c0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
1f7d0 65 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67  e the rowset reg
1f7e0 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ister to contain
1f7f0 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55   NULL. An SQL NU
1f800 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71  LL is .    ** eq
1f810 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65  uivalent to an e
1f820 6d 70 74 79 20 72 6f 77 73 65 74 2e 20 20 4f 72  mpty rowset.  Or
1f830 2c 20 63 72 65 61 74 65 20 61 6e 20 65 70 68 65  , create an ephe
1f840 6d 65 72 61 6c 20 69 6e 64 65 78 0a 20 20 20 20  meral index.    
1f850 2a 2a 20 63 61 70 61 62 6c 65 20 6f 66 20 68 6f  ** capable of ho
1f860 6c 64 69 6e 67 20 70 72 69 6d 61 72 79 20 6b 65  lding primary ke
1f870 79 73 20 69 6e 20 74 68 65 20 63 61 73 65 20 6f  ys in the case o
1f880 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  f a WITHOUT ROWI
1f890 44 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  D..    **.    **
1f8a0 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65   Also initialize
1f8b0 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f   regReturn to co
1f8c0 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72 65 73  ntain the addres
1f8d0 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63  s of the instruc
1f8e0 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d  tion .    ** imm
1f8f0 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
1f900 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e  ng the OP_Return
1f910 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
1f920 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73  f the loop. This
1f930 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69  .    ** is requi
1f940 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73  red in a few obs
1f950 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63  cure LEFT JOIN c
1f960 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72  ases where contr
1f970 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20  ol jumps.    ** 
1f980 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20  over the top of 
1f990 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68  the loop into th
1f9a0 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e  e body of it. In
1f9b0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
1f9c0 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72      ** correct r
1f9d0 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20  esponse for the 
1f9e0 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65  end-of-loop code
1f9f0 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29   (the OP_Return)
1fa00 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66   is to .    ** f
1fa10 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
1fa20 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
1fa30 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20  ion, just as an 
1fa40 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a  OP_Next does if.
1fa50 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e      ** called on
1fa60 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   an uninitialize
1fa70 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f  d cursor..    */
1fa80 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f  .    if( (pWInfo
1fa90 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
1faa0 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
1fab0 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
1fac0 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
1fad0 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  b) ){.        re
1fae0 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72  gRowset = ++pPar
1faf0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1fb00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1fb10 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1fb20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20  0, regRowset);. 
1fb30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fb40 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d      Index *pPk =
1fb50 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
1fb60 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
1fb70 20 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74         regRowset
1fb80 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1fb90 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  +;.        sqlit
1fba0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1fbb0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1fbc0 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 70 50 6b  , regRowset, pPk
1fbd0 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20  ->nKeyCol);.    
1fbe0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
1fbf0 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
1fc00 73 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20 20 20  se, pPk);.      
1fc10 7d 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64  }.      regRowid
1fc20 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1fc30 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65  m;.    }.    iRe
1fc40 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56  tInit = sqlite3V
1fc50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1fc60 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52  Integer, 0, regR
1fc70 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  eturn);..    /* 
1fc80 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
1fc90 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
1fca0 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  z of the form:  
1fcb0 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e  (x1 OR x2 OR ...
1fcc0 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54  ) AND y.    ** T
1fcd0 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65  hen for every te
1fce0 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20  rm xN, evaluate 
1fcf0 61 73 20 74 68 65 20 73 75 62 65 78 70 72 65 73  as the subexpres
1fd00 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20  sion: xN AND z. 
1fd10 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20     ** That way, 
1fd20 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20  terms in y that 
1fd30 61 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74  are factored int
1fd40 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f  o the disjunctio
1fd50 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  n will.    ** be
1fd60 20 70 69 63 6b 65 64 20 75 70 20 62 79 20 74 68   picked up by th
1fd70 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1fd80 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  s to sqlite3Wher
1fd90 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a  eBegin() below..
1fda0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63      **.    ** Ac
1fdb0 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62  tually, each sub
1fdc0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
1fdd0 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41  nverted to "xN A
1fde0 4e 44 20 77 22 20 77 68 65 72 65 20 77 20 69 73  ND w" where w is
1fdf0 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74  .    ** the "int
1fe00 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20  eresting" terms 
1fe10 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61  of z - terms tha
1fe20 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e  t did not origin
1fe30 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ate in the.    *
1fe40 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  * ON or USING cl
1fe50 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
1fe60 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74  OIN, and terms t
1fe70 68 61 74 20 61 72 65 20 75 73 61 62 6c 65 20 61  hat are usable a
1fe80 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  s .    ** indice
1fe90 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
1fea0 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   This optimizati
1feb0 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70  on also only app
1fec0 6c 69 65 73 20 69 66 20 74 68 65 20 28 78 31 20  lies if the (x1 
1fed0 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65  OR x2 OR ...) te
1fee0 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  rm.    ** is not
1fef0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
1ff00 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
1ff10 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20   LEFT JOIN..    
1ff20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68 74  ** See ticket ht
1ff30 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e  tp://www.sqlite.
1ff40 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33  org/src/info/f23
1ff50 36 39 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20  69304e4.    */. 
1ff60 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72     if( pWC->nTer
1ff70 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  m>1 ){.      int
1ff80 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f   iTerm;.      fo
1ff90 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d  r(iTerm=0; iTerm
1ffa0 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65  <pWC->nTerm; iTe
1ffb0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45  rm++){.        E
1ffc0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43  xpr *pExpr = pWC
1ffd0 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72  ->a[iTerm].pExpr
1ffe0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 26 70  ;.        if( &p
1fff0 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d 20  WC->a[iTerm] == 
20000 70 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65  pTerm ) continue
20010 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  ;.        if( Ex
20020 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
20030 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
20040 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
20050 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20060 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74  pWC->a[iTerm].wt
20070 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49  Flags & TERM_ORI
20080 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20 20 20 74  NFO );.        t
20090 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61 5b  estcase( pWC->a[
200a0 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26  iTerm].wtFlags &
200b0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
200c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57 43  .        if( pWC
200d0 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61  ->a[iTerm].wtFla
200e0 67 73 20 26 20 28 54 45 52 4d 5f 4f 52 49 4e 46  gs & (TERM_ORINF
200f0 4f 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20  O|TERM_VIRTUAL) 
20100 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
20110 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b      if( (pWC->a[
20120 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72  iTerm].eOperator
20130 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20   & WO_ALL)==0 ) 
20140 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20150 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
20160 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
20170 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
20180 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
20190 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 41  e3ExprAnd(db, pA
201a0 6e 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a  ndExpr, pExpr);.
201b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
201c0 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20  ( pAndExpr ){.  
201d0 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d        pAndExpr =
201e0 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
201f0 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  arse, TK_AND, 0,
20200 20 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20   pAndExpr, 0);. 
20210 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
20220 20 20 2f 2a 20 52 75 6e 20 61 20 73 65 70 61 72    /* Run a separ
20230 61 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ate WHERE clause
20240 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f   for each term o
20250 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e  f the OR clause.
20260 20 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 65    After.    ** e
20270 6c 69 6d 69 6e 61 74 69 6e 67 20 64 75 70 6c 69  liminating dupli
20280 63 61 74 65 73 20 66 72 6f 6d 20 6f 74 68 65 72  cates from other
20290 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2c 20   WHERE clauses, 
202a0 74 68 65 20 61 63 74 69 6f 6e 20 66 6f 72 20 65  the action for e
202b0 61 63 68 0a 20 20 20 20 2a 2a 20 73 75 62 2d 57  ach.    ** sub-W
202c0 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74  HERE clause is t
202d0 6f 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  o to invoke the 
202e0 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 61  main loop body a
202f0 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 0a  s a subroutine..
20300 20 20 20 20 2a 2f 0a 20 20 20 20 77 63 74 72 6c      */.    wctrl
20310 46 6c 61 67 73 20 3d 20 20 57 48 45 52 45 5f 4f  Flags =  WHERE_O
20320 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 0a 20  MIT_OPEN_CLOSE. 
20330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
20340 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
20350 4c 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  LE.             
20360 20 20 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41     | WHERE_ONETA
20370 42 4c 45 5f 4f 4e 4c 59 3b 0a 20 20 20 20 66 6f  BLE_ONLY;.    fo
20380 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63  r(ii=0; ii<pOrWc
20390 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a  ->nTerm; ii++){.
203a0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
203b0 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57  *pOrTerm = &pOrW
203c0 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20  c->a[ii];.      
203d0 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
203e0 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c  tCursor==iCur ||
203f0 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
20400 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d  ator & WO_AND)!=
20410 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  0 ){.        Whe
20420 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66  reInfo *pSubWInf
20430 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
20440 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20  Info for single 
20450 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a  OR-term scan */.
20460 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f          Expr *pO
20470 72 45 78 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d  rExpr = pOrTerm-
20480 3e 70 45 78 70 72 3b 20 2f 2a 20 43 75 72 72 65  >pExpr; /* Curre
20490 6e 74 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72  nt OR clause ter
204a0 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  m */.        int
204b0 20 6a 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20   j1 = 0;        
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
204d0 41 64 64 72 65 73 73 20 6f 66 20 6a 75 6d 70 20  Address of jump 
204e0 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  operation */.   
204f0 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70       if( pAndExp
20500 72 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  r && !ExprHasPro
20510 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20 45  perty(pOrExpr, E
20520 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
20530 20 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70           pAndExp
20540 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78  r->pLeft = pOrEx
20550 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  pr;.          pO
20560 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72  rExpr = pAndExpr
20570 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20580 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
20590 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65  ugh table entrie
205a0 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72  s that match ter
205b0 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20  m pOrTerm. */.  
205c0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
205d0 28 30 78 66 66 66 66 2c 20 28 22 53 75 62 70 6c  (0xffff, ("Subpl
205e0 61 6e 20 66 6f 72 20 4f 52 2d 63 6c 61 75 73 65  an for OR-clause
205f0 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  :\n"));.        
20600 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69  pSubWInfo = sqli
20610 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
20620 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f  arse, pOrTab, pO
20630 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20  rExpr, 0, 0,.   
20640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20660 20 20 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 69     wctrlFlags, i
20670 43 6f 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20  CovCur);.       
20680 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e   assert( pSubWIn
20690 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  fo || pParse->nE
206a0 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
206b0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
206c0 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20    if( pSubWInfo 
206d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65  ){.          Whe
206e0 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70  reLoop *pSubLoop
206f0 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c  ;.          expl
20700 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20  ainOneScan(.    
20710 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
20720 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57  , pOrTab, &pSubW
20730 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76  Info->a[0], iLev
20740 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  el, pLevel->iFro
20750 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29  m, 0.          )
20760 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;.          /* T
20770 68 69 73 20 69 73 20 74 68 65 20 73 75 62 2d 57  his is the sub-W
20780 48 45 52 45 20 63 6c 61 75 73 65 20 62 6f 64 79  HERE clause body
20790 2e 20 20 46 69 72 73 74 20 73 6b 69 70 20 6f 76  .  First skip ov
207a0 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
207b0 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 66  duplicate rows f
207c0 72 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d 57 48  rom prior sub-WH
207d0 45 52 45 20 63 6c 61 75 73 65 73 2c 20 61 6e 64  ERE clauses, and
207e0 20 72 65 63 6f 72 64 20 74 68 65 0a 20 20 20 20   record the.    
207f0 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 28        ** rowid (
20800 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 29 20  or PRIMARY KEY) 
20810 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
20820 72 6f 77 20 73 6f 20 74 68 61 74 20 74 68 65 20  row so that the 
20830 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a  same.          *
20840 2a 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 73 6b  * row will be sk
20850 69 70 70 65 64 20 69 6e 20 73 75 62 73 65 71 75  ipped in subsequ
20860 65 6e 74 20 73 75 62 2d 57 48 45 52 45 20 63 6c  ent sub-WHERE cl
20870 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 20  auses..         
20880 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
20890 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
208a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55  Flags & WHERE_DU
208b0 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20  PLICATES_OK)==0 
208c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
208d0 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20  nt r;.          
208e0 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69    int iSet = ((i
208f0 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  i==pOrWc->nTerm-
20900 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20  1)?-1:ii);.     
20910 20 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f         if( HasRo
20920 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
20930 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73             r = s
20940 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
20950 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
20960 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20  pTab, -1, iCur, 
20970 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20  regRowid, 0);.  
20980 20 20 20 20 20 20 20 20 20 20 20 20 6a 31 20 3d              j1 =
20990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
209a0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53  p4Int(v, OP_RowS
209b0 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65  etTest, regRowse
209c0 74 2c 20 30 2c 20 72 2c 69 53 65 74 29 3b 0a 20  t, 0, r,iSet);. 
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62               Vdb
209e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
209f0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
20a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49  .              I
20a10 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69  ndex *pPk = sqli
20a20 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
20a30 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
20a40 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6b 20          int nPk 
20a50 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a  = pPk->nKeyCol;.
20a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
20a70 74 20 69 50 6b 3b 0a 0a 20 20 20 20 20 20 20 20  t iPk;..        
20a80 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
20a90 65 20 50 4b 20 69 6e 74 6f 20 61 6e 20 61 72 72  e PK into an arr
20aa0 61 79 20 6f 66 20 74 65 6d 70 20 72 65 67 69 73  ay of temp regis
20ab0 74 65 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ters. */.       
20ac0 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74         r = sqlit
20ad0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
20ae0 50 61 72 73 65 2c 20 6e 50 6b 29 3b 0a 20 20 20  Parse, nPk);.   
20af0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
20b00 50 6b 3d 30 3b 20 69 50 6b 3c 6e 50 6b 3b 20 69  Pk=0; iPk<nPk; i
20b10 50 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  Pk++){.         
20b20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
20b30 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  = pPk->aiColumn[
20b40 69 50 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  iPk];.          
20b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20b60 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
20b70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43 6f  Parse, pTab, iCo
20b80 6c 2c 20 69 43 75 72 2c 20 72 2b 69 50 6b 2c 20  l, iCur, r+iPk, 
20b90 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
20ba0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
20bb0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
20bc0 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 61 6c  he temp table al
20bd0 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 74  ready contains t
20be0 68 69 73 20 6b 65 79 2e 20 49 66 20 73 6f 2c 0a  his key. If so,.
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
20c00 20 74 68 65 20 72 6f 77 20 68 61 73 20 61 6c 72   the row has alr
20c10 65 61 64 79 20 62 65 65 6e 20 69 6e 63 6c 75 64  eady been includ
20c20 65 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ed in the result
20c30 20 73 65 74 20 61 6e 64 0a 20 20 20 20 20 20 20   set and.       
20c40 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65         ** can be
20c50 20 69 67 6e 6f 72 65 64 20 28 62 79 20 6a 75 6d   ignored (by jum
20c60 70 69 6e 67 20 70 61 73 74 20 74 68 65 20 47 6f  ping past the Go
20c70 73 75 62 20 62 65 6c 6f 77 29 2e 20 4f 74 68 65  sub below). Othe
20c80 72 77 69 73 65 2c 0a 20 20 20 20 20 20 20 20 20  rwise,.         
20c90 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 74       ** insert t
20ca0 68 65 20 6b 65 79 20 69 6e 74 6f 20 74 68 65 20  he key into the 
20cb0 74 65 6d 70 20 74 61 62 6c 65 20 61 6e 64 20 70  temp table and p
20cc0 72 6f 63 65 65 64 20 77 69 74 68 20 70 72 6f 63  roceed with proc
20cd0 65 73 73 69 6e 67 0a 20 20 20 20 20 20 20 20 20  essing.         
20ce0 20 20 20 20 20 2a 2a 20 74 68 65 20 72 6f 77 2e       ** the row.
20cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
20d00 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *.              
20d10 2a 2a 20 55 73 65 20 73 6f 6d 65 20 6f 66 20 74  ** Use some of t
20d20 68 65 20 73 61 6d 65 20 6f 70 74 69 6d 69 7a 61  he same optimiza
20d30 74 69 6f 6e 73 20 61 73 20 4f 50 5f 52 6f 77 53  tions as OP_RowS
20d40 65 74 54 65 73 74 3a 20 49 66 20 69 53 65 74 0a  etTest: If iSet.
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
20d60 20 69 73 20 7a 65 72 6f 2c 20 61 73 73 75 6d 65   is zero, assume
20d70 20 74 68 61 74 20 74 68 65 20 6b 65 79 20 63 61   that the key ca
20d80 6e 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 20  nnot already be 
20d90 70 72 65 73 65 6e 74 20 69 6e 0a 20 20 20 20 20  present in.     
20da0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
20db0 74 65 6d 70 20 74 61 62 6c 65 2e 20 41 6e 64 20  temp table. And 
20dc0 69 66 20 69 53 65 74 20 69 73 20 2d 31 2c 20 61  if iSet is -1, a
20dd0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 72 65  ssume that there
20de0 20 69 73 20 6e 6f 20 0a 20 20 20 20 20 20 20 20   is no .        
20df0 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f        ** need to
20e00 20 69 6e 73 65 72 74 20 74 68 65 20 6b 65 79 20   insert the key 
20e10 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61  into the temp ta
20e20 62 6c 65 2c 20 61 73 20 69 74 20 77 69 6c 6c 20  ble, as it will 
20e30 6e 65 76 65 72 20 0a 20 20 20 20 20 20 20 20 20  never .         
20e40 20 20 20 20 20 2a 2a 20 62 65 20 74 65 73 74 65       ** be teste
20e50 64 20 66 6f 72 2e 20 20 2a 2f 20 0a 20 20 20 20  d for.  */ .    
20e60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 53            if( iS
20e70 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  et ){.          
20e80 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74        j1 = sqlit
20e90 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
20ea0 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 72 65 67  v, OP_Found, reg
20eb0 52 6f 77 73 65 74 2c 20 30 2c 20 72 2c 20 6e 50  Rowset, 0, r, nP
20ec0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
20ed0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
20ee0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
20ef0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
20f00 20 20 20 69 66 28 20 69 53 65 74 3e 3d 30 20 29     if( iSet>=0 )
20f10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
20f20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20f30 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
20f40 63 6f 72 64 2c 20 72 2c 20 6e 50 6b 2c 20 72 65  cord, r, nPk, re
20f50 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  gRowid);.       
20f60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20f70 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
20f80 5f 49 64 78 49 6e 73 65 72 74 2c 20 72 65 67 52  _IdxInsert, regR
20f90 6f 77 73 65 74 2c 20 72 65 67 52 6f 77 69 64 2c  owset, regRowid,
20fa0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
20fb0 20 20 20 20 20 69 66 28 20 69 53 65 74 20 29 20       if( iSet ) 
20fc0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
20fd0 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53  eP5(v, OPFLAG_US
20fe0 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20  ESEEKRESULT);.  
20ff0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
21000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21010 52 65 6c 65 61 73 65 20 74 68 65 20 61 72 72 61  Release the arra
21020 79 20 6f 66 20 74 65 6d 70 20 72 65 67 69 73 74  y of temp regist
21030 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ers */.         
21040 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
21050 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
21060 72 73 65 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20 20  rse, r, nPk);.  
21070 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21080 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
21090 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65     /* Invoke the
210a0 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20   main loop body 
210b0 61 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  as a subroutine 
210c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
210d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
210e0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
210f0 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79  eturn, iLoopBody
21100 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  );..          /*
21110 20 4a 75 6d 70 20 68 65 72 65 20 28 73 6b 69 70   Jump here (skip
21120 70 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 6c 6f  ping the main lo
21130 6f 70 20 62 6f 64 79 20 73 75 62 72 6f 75 74 69  op body subrouti
21140 6e 65 29 20 69 66 20 74 68 65 0a 20 20 20 20 20  ne) if the.     
21150 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20       ** current 
21160 73 75 62 2d 57 48 45 52 45 20 72 6f 77 20 69 73  sub-WHERE row is
21170 20 61 20 64 75 70 6c 69 63 61 74 65 20 66 72 6f   a duplicate fro
21180 6d 20 70 72 69 6f 72 20 73 75 62 2d 57 48 45 52  m prior sub-WHER
21190 45 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  Es. */.         
211a0 20 69 66 28 20 6a 31 20 29 20 73 71 6c 69 74 65   if( j1 ) sqlite
211b0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
211c0 20 6a 31 29 3b 0a 0a 20 20 20 20 20 20 20 20 20   j1);..         
211d0 20 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66   /* The pSubWInf
211e0 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
211f0 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74   flag means that
21200 20 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20   this OR term.  
21210 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
21220 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ined one or more
21230 20 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61   AND term from a
21240 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e   notReady table.
21250 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 20 20    The.          
21260 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68  ** terms from th
21270 65 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  e notReady table
21280 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65   could not be te
21290 73 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20  sted and will.  
212a0 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20          ** need 
212b0 74 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61 74  to be tested lat
212c0 65 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  er..          */
212d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
212e0 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  SubWInfo->untest
212f0 65 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74  edTerms ) untest
21300 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20  edTerms = 1;..  
21310 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
21320 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e  l of the OR-conn
21330 65 63 74 65 64 20 74 65 72 6d 73 20 61 72 65 20  ected terms are 
21340 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20  optimized using 
21350 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20  the same.       
21360 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64     ** index, and
21370 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f 70   the index is op
21380 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ened using the s
21390 61 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ame cursor numbe
213a0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  r.          ** b
213b0 79 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73  y each call to s
213c0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
213d0 28 29 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  () made by this 
213e0 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20 20  loop, it may.   
213f0 20 20 20 20 20 20 20 2a 2a 20 62 65 20 70 6f 73         ** be pos
21400 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68 61  sible to use tha
21410 74 20 69 6e 64 65 78 20 61 73 20 61 20 63 6f 76  t index as a cov
21420 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20  ering index..   
21430 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
21440 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61      ** If the ca
21450 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
21460 72 65 42 65 67 69 6e 28 29 20 61 62 6f 76 65 20  reBegin() above 
21470 72 65 73 75 6c 74 65 64 20 69 6e 20 61 20 73 63  resulted in a sc
21480 61 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  an that.        
21490 20 20 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e 64    ** uses an ind
214a0 65 78 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20  ex, and this is 
214b0 65 69 74 68 65 72 20 74 68 65 20 66 69 72 73 74  either the first
214c0 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
214d0 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  rm.          ** 
214e0 70 72 6f 63 65 73 73 65 64 20 6f 72 20 74 68 65  processed or the
214f0 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 73 61   index is the sa
21500 6d 65 20 61 73 20 74 68 61 74 20 75 73 65 64 20  me as that used 
21510 62 79 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a  by all previous.
21520 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72            ** ter
21530 6d 73 2c 20 73 65 74 20 70 43 6f 76 20 74 6f 20  ms, set pCov to 
21540 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 63 6f  the candidate co
21550 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74  vering index. Ot
21560 68 65 72 77 69 73 65 2c 20 73 65 74 20 0a 20 20  herwise, set .  
21570 20 20 20 20 20 20 20 20 2a 2a 20 70 43 6f 76 20          ** pCov 
21580 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63  to NULL to indic
21590 61 74 65 20 74 68 61 74 20 6e 6f 20 63 61 6e 64  ate that no cand
215a0 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69  idate covering i
215b0 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20 20 20 20  ndex will .     
215c0 20 20 20 20 20 2a 2a 20 62 65 20 61 76 61 69 6c       ** be avail
215d0 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  able..          
215e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  */.          pSu
215f0 62 4c 6f 6f 70 20 3d 20 70 53 75 62 57 49 6e 66  bLoop = pSubWInf
21600 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a  o->a[0].pWLoop;.
21610 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
21620 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46  ( (pSubLoop->wsF
21630 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
21640 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20  O_INDEX)==0 );. 
21650 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 53           if( (pS
21660 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  ubLoop->wsFlags 
21670 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
21680 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  !=0.           &
21690 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75 62  & (ii==0 || pSub
216a0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
216b0 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20  ndex==pCov).    
216c0 20 20 20 20 20 20 20 26 26 20 28 48 61 73 52 6f         && (HasRo
216d0 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73  wid(pTab) || !Is
216e0 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
216f0 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  pSubLoop->u.btre
21700 65 2e 70 49 6e 64 65 78 29 29 0a 20 20 20 20 20  e.pIndex)).     
21710 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
21720 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
21730 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78  WInfo->a[0].iIdx
21740 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a  Cur==iCovCur );.
21750 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76              pCov
21760 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62   = pSubLoop->u.b
21770 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
21780 20 20 20 20 20 20 20 20 20 77 63 74 72 6c 46 6c           wctrlFl
21790 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 4f  ags |= WHERE_REO
217a0 50 45 4e 5f 49 44 58 3b 0a 20 20 20 20 20 20 20  PEN_IDX;.       
217b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
217c0 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a        pCov = 0;.
217d0 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
217e0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68         /* Finish
217f0 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67   the loop throug
21800 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
21810 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
21820 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
21830 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
21840 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29  reEnd(pSubWInfo)
21850 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21860 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c    }.    }.    pL
21870 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20  evel->u.pCovidx 
21880 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28 20  = pCov;.    if( 
21890 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e 69  pCov ) pLevel->i
218a0 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75 72  IdxCur = iCovCur
218b0 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45 78  ;.    if( pAndEx
218c0 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e 64  pr ){.      pAnd
218d0 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b  Expr->pLeft = 0;
218e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
218f0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 41 6e  prDelete(db, pAn
21900 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  dExpr);.    }.  
21910 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
21920 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69  ngeP1(v, iRetIni
21930 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t, sqlite3VdbeCu
21940 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20  rrentAddr(v));. 
21950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21960 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
21970 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72   0, pLevel->addr
21980 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Brk);.    sqlite
21990 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
219a0 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b  l(v, iLoopBody);
219b0 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ..    if( pWInfo
219c0 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c  ->nLevel>1 ) sql
219d0 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64 62  ite3StackFree(db
219e0 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20 69  , pOrTab);.    i
219f0 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72 6d  f( !untestedTerm
21a00 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d 28  s ) disableTerm(
21a10 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
21a20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
21a30 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  * SQLITE_OMIT_OR
21a40 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
21a50 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73  ..  {.    /* Cas
21a60 65 20 36 3a 20 20 54 68 65 72 65 20 69 73 20 6e  e 6:  There is n
21a70 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20  o usable index. 
21a80 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f   We must do a co
21a90 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20 20  mplete.    **   
21aa0 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74         scan of t
21ab0 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e  he entire table.
21ac0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74  .    */.    stat
21ad0 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 65  ic const u8 aSte
21ae0 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c  p[] = { OP_Next,
21af0 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20   OP_Prev };.    
21b00 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
21b10 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f  aStart[] = { OP_
21b20 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20  Rewind, OP_Last 
21b30 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62  };.    assert( b
21b40 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d  Rev==0 || bRev==
21b50 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  1 );.    if( pTa
21b60 62 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73 69  bItem->isRecursi
21b70 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ve ){.      /* T
21b80 61 62 6c 65 73 20 6d 61 72 6b 65 64 20 69 73 52  ables marked isR
21b90 65 63 75 72 73 69 76 65 20 68 61 76 65 20 6f 6e  ecursive have on
21ba0 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ly a single row 
21bb0 74 68 61 74 20 69 73 20 73 74 6f 72 65 64 20 69  that is stored i
21bc0 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 70 73 65  n.      ** a pse
21bd0 75 64 6f 2d 63 75 72 73 6f 72 2e 20 20 4e 6f 20  udo-cursor.  No 
21be0 6e 65 65 64 20 74 6f 20 52 65 77 69 6e 64 20 6f  need to Rewind o
21bf0 72 20 4e 65 78 74 20 73 75 63 68 20 63 75 72 73  r Next such curs
21c00 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4c  ors. */.      pL
21c10 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
21c20 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  op;.    }else{. 
21c30 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
21c40 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20  = aStep[bRev];. 
21c50 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
21c60 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c  = iCur;.      pL
21c70 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73  evel->p2 = 1 + s
21c80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21c90 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d  (v, aStart[bRev]
21ca0 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
21cb0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
21cc0 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d  rageIf(v, bRev==
21cd0 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  0);.      VdbeCo
21ce0 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
21cf0 21 3d 30 29 3b 0a 20 20 20 20 20 20 70 4c 65 76  !=0);.      pLev
21d00 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f  el->p5 = SQLITE_
21d10 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
21d20 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 0a  CAN_STEP;.    }.
21d30 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74    }..  /* Insert
21d40 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76   code to test ev
21d50 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69 6f  ery subexpressio
21d60 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f  n that can be co
21d70 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f  mpletely.  ** co
21d80 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68 65  mputed using the
21d90 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20   current set of 
21da0 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  tables..  */.  f
21db0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
21dc0 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a   j=pWC->nTerm; j
21dd0 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b  >0; j--, pTerm++
21de0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b  ){.    Expr *pE;
21df0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
21e00 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
21e10 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
21e20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
21e30 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
21e40 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
21e50 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
21e60 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
21e70 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
21e80 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
21e90 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
21ea0 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e  eqAll & pLevel->
21eb0 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a  notReady)!=0 ){.
21ec0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21ed0 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
21ee0 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20  Terms==0.       
21ef0 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
21f00 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
21f10 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
21f20 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20  ONLY)!=0 );.    
21f30 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74    pWInfo->untest
21f40 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20  edTerms = 1;.   
21f50 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
21f60 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72   }.    pE = pTer
21f70 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  m->pExpr;.    as
21f80 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20  sert( pE!=0 );. 
21f90 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
21fa0 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70  LeftJoin && !Exp
21fb0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
21fc0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
21fd0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
21fe0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
21ff0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
22000 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f  arse, pE, addrCo
22010 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
22020 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72  FNULL);.    pTer
22030 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
22040 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20  RM_CODED;.  }.. 
22050 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20   /* Insert code 
22060 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70 6c  to test for impl
22070 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ied constraints 
22080 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69 74  based on transit
22090 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74 68  ivity.  ** of th
220a0 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72 2e  e "==" operator.
220b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70  .  **.  ** Examp
220c0 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45 52 45  le: If the WHERE
220d0 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
220e0 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e 64   "t1.a=t2.b" and
220f0 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a 2a   "t2.b=123".  **
22100 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64 69   and we are codi
22110 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61  ng the t1 loop a
22120 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 68  nd the t2 loop h
22130 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65 64  as not yet coded
22140 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20 63  ,.  ** then we c
22150 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22 74  annot use the "t
22160 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74 72  1.a=t2.b" constr
22170 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61 6e  aint, but we can
22180 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20 69   code.  ** the i
22190 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32 33  mplied "t1.a=123
221a0 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20  " constraint..  
221b0 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  */.  for(pTerm=p
221c0 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54  WC->a, j=pWC->nT
221d0 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  erm; j>0; j--, p
221e0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
221f0 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a 20  r *pE, *pEAlt;. 
22200 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41     WhereTerm *pA
22210 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  lt;.    if( pTer
22220 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
22230 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
22240 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
22250 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
22260 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28 57 4f  ->eOperator!=(WO
22270 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29 20 29 20  _EQUIV|WO_EQ) ) 
22280 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
22290 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
222a0 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  sor!=iCur ) cont
222b0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4c  inue;.    if( pL
222c0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
222d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
222e0 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
222f0 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  r;.    assert( !
22300 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
22310 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
22320 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
22330 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
22340 67 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f  ght & pLevel->no
22350 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20 20  tReady)!=0 );.  
22360 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54 65 72    pAlt = findTer
22370 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54 65  m(pWC, iCur, pTe
22380 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
22390 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45  , notReady, WO_E
223a0 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20  Q|WO_IN, 0);.   
223b0 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20 63   if( pAlt==0 ) c
223c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
223d0 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20 26   pAlt->wtFlags &
223e0 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20   (TERM_CODED) ) 
223f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74 65  continue;.    te
22400 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f  stcase( pAlt->eO
22410 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
22420 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
22430 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72   pAlt->eOperator
22440 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
22450 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
22460 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72 61  t((v, "begin tra
22470 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69  nsitive constrai
22480 6e 74 22 29 29 3b 0a 20 20 20 20 70 45 41 6c 74  nt"));.    pEAlt
22490 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41   = sqlite3StackA
224a0 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
224b0 6f 66 28 2a 70 45 41 6c 74 29 29 3b 0a 20 20 20  of(*pEAlt));.   
224c0 20 69 66 28 20 70 45 41 6c 74 20 29 7b 0a 20 20   if( pEAlt ){.  
224d0 20 20 20 20 2a 70 45 41 6c 74 20 3d 20 2a 70 41      *pEAlt = *pA
224e0 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  lt->pExpr;.     
224f0 20 70 45 41 6c 74 2d 3e 70 4c 65 66 74 20 3d 20   pEAlt->pLeft = 
22500 70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pE->pLeft;.     
22510 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
22520 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 41 6c  lse(pParse, pEAl
22530 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  t, addrCont, SQL
22540 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
22550 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
22560 61 63 6b 46 72 65 65 28 64 62 2c 20 70 45 41 6c  ackFree(db, pEAl
22570 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
22580 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f   /* For a LEFT O
22590 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72  UTER JOIN, gener
225a0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
225b0 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  ll record the fa
225c0 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20  ct that.  ** at 
225d0 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66  least one row of
225e0 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
225f0 20 68 61 73 20 6d 61 74 63 68 65 64 20 74 68 65   has matched the
22600 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20   left table.  . 
22610 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
22620 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
22630 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46     pLevel->addrF
22640 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
22650 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
22660 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
22670 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
22680 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c  teger, 1, pLevel
22690 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
226a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
226b0 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a  , "record LEFT J
226c0 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20  OIN hit"));.    
226d0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
226e0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
226f0 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
22700 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d  ->a, j=0; j<pWC-
22710 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65  >nTerm; j++, pTe
22720 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73  rm++){.      tes
22730 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
22740 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
22750 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  TUAL );.      te
22760 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
22770 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
22780 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28  DED );.      if(
22790 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
227a0 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
227b0 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
227c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
227d0 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
227e0 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f  All & pLevel->no
227f0 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20  tReady)!=0 ){.  
22800 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
22810 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
22820 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20 63  rms );.        c
22830 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
22840 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22850 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
22860 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
22870 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
22880 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64  pTerm->pExpr, ad
22890 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a  drCont, SQLITE_J
228a0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
228b0 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
228c0 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
228d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
228e0 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  urn pLevel->notR
228f0 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  eady;.}..#ifdef 
22900 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
22910 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  ED./*.** Print t
22920 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
22930 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74  WhereTerm object
22940 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22950 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 57  whereTermPrint(W
22960 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
22970 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a 20 20 69   int iTerm){.  i
22980 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20  f( pTerm==0 ){. 
22990 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
229a0 72 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d 33 64  rintf("TERM-%-3d
229b0 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d 29   NULL\n", iTerm)
229c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
229d0 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20  har zType[4];.  
229e0 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20    memcpy(zType, 
229f0 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20 20 69  "...", 4);.    i
22a00 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
22a10 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
22a20 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56   ) zType[0] = 'V
22a30 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ';.    if( pTerm
22a40 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
22a50 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70 65 5b  _EQUIV  ) zType[
22a60 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20 69 66  1] = 'E';.    if
22a70 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
22a80 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
22a90 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a  EP_FromJoin) ) z
22aa0 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20  Type[2] = 'L';. 
22ab0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
22ac0 72 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d 33 64  rintf("TERM-%-3d
22ad0 20 25 70 20 25 73 20 63 75 72 73 6f 72 3d 25 2d   %p %s cursor=%-
22ae0 33 64 20 70 72 6f 62 3d 25 2d 33 64 20 6f 70 3d  3d prob=%-3d op=
22af0 30 78 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20  0x%03x\n",.     
22b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b10 20 20 69 54 65 72 6d 2c 20 70 54 65 72 6d 2c 20    iTerm, pTerm, 
22b20 7a 54 79 70 65 2c 20 70 54 65 72 6d 2d 3e 6c 65  zType, pTerm->le
22b30 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72 6d 2d  ftCursor, pTerm-
22b40 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20 20 20 20  >truthProb,.    
22b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b60 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
22b70 74 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tor);.    sqlite
22b80 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c  3TreeViewExpr(0,
22b90 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30   pTerm->pExpr, 0
22ba0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
22bb0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
22bc0 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a  CE_ENABLED./*.**
22bd0 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c 6f   Print a WhereLo
22be0 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64 65  op object for de
22bf0 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73  bugging purposes
22c00 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22c10 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57  whereLoopPrint(W
22c20 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65  hereLoop *p, Whe
22c30 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a  reClause *pWC){.
22c40 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
22c50 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
22c60 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b  o;.  int nb = 1+
22c70 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  (pWInfo->pTabLis
22c80 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20 20  t->nSrc+7)/8;.  
22c90 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22ca0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57 49  tem *pItem = pWI
22cb0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
22cc0 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61   + p->iTab;.  Ta
22cd0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65  ble *pTab = pIte
22ce0 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  m->pTab;.  sqlit
22cf0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
22d00 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c  c%2d.%0*llx.%0*l
22d10 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20  lx", p->cId,.   
22d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d30 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70    p->iTab, nb, p
22d40 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20  ->maskSelf, nb, 
22d50 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73 71  p->prereq);.  sq
22d60 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
22d70 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20 20  (" %12s",.      
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22d90 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70  Item->zAlias ? p
22da0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70  Item->zAlias : p
22db0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  Tab->zName);.  i
22dc0 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
22dd0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
22de0 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  BLE)==0 ){.    c
22df0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
22e00 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 62  ;.    if( p->u.b
22e10 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26 20 28  tree.pIndex && (
22e20 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72  zName = p->u.btr
22e30 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ee.pIndex->zName
22e40 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
22e50 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c  ( strncmp(zName,
22e60 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
22e70 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a  ex_", 17)==0 ){.
22e80 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20          int i = 
22e90 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
22ea0 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20  zName) - 1;.    
22eb0 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65      while( zName
22ec0 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a  [i]!='_' ) i--;.
22ed0 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d          zName +=
22ee0 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
22ef0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
22f00 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32 64  intf(".%-16s %2d
22f10 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62  ", zName, p->u.b
22f20 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d  tree.nEq);.    }
22f30 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
22f40 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
22f50 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d  %20s","");.    }
22f60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
22f70 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70  ar *z;.    if( p
22f80 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
22f90 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  ){.      z = sql
22fa0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25  ite3_mprintf("(%
22fb0 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20  d,\"%s\",%x)",. 
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22fd0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c  ->u.vtab.idxNum,
22fe0 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74   p->u.vtab.idxSt
22ff0 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  r, p->u.vtab.omi
23000 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73  tMask);.    }els
23010 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  e{.      z = sql
23020 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25  ite3_mprintf("(%
23030 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61  d,%x)", p->u.vta
23040 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
23050 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20  tab.omitMask);. 
23060 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
23070 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 2d  DebugPrintf(" %-
23080 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71  19s", z);.    sq
23090 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
230a0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c   }.  if( p->wsFl
230b0 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50  ags & WHERE_SKIP
230c0 53 43 41 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  SCAN ){.    sqli
230d0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
230e0 20 66 20 25 30 35 78 20 25 64 2d 25 64 22 2c 20   f %05x %d-%d", 
230f0 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e  p->wsFlags, p->n
23100 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29 3b  LTerm,p->nSkip);
23110 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
23120 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23130 28 22 20 66 20 25 30 35 78 20 4e 20 25 64 22 2c  (" f %05x N %d",
23140 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e   p->wsFlags, p->
23150 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 73  nLTerm);.  }.  s
23160 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
23170 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25  f(" cost %d,%d,%
23180 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c  d\n", p->rSetup,
23190 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75   p->rRun, p->nOu
231a0 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54  t);.  if( p->nLT
231b0 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33 57  erm && (sqlite3W
231c0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31 30  hereTrace & 0x10
231d0 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  0)!=0 ){.    int
231e0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
231f0 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b   i<p->nLTerm; i+
23200 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 54  +){.      whereT
23210 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c 54 65  ermPrint(p->aLTe
23220 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d  rm[i], i);.    }
23230 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
23240 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c  *.** Convert bul
23250 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20  k memory into a 
23260 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70 20  valid WhereLoop 
23270 74 68 61 74 20 63 61 6e 20 62 65 20 70 61 73 73  that can be pass
23280 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f  ed.** to whereLo
23290 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73 73  opClear harmless
232a0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
232b0 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  id whereLoopInit
232c0 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a  (WhereLoop *p){.
232d0 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d    p->aLTerm = p-
232e0 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20  >aLTermSpace;.  
232f0 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  p->nLTerm = 0;. 
23300 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72   p->nLSlot = Arr
23310 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d  aySize(p->aLTerm
23320 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46  Space);.  p->wsF
23330 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  lags = 0;.}../*.
23340 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68 65  ** Clear the Whe
23350 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20  reLoop.u union. 
23360 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f 70   Leave WhereLoop
23370 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a  .pLTerm intact..
23380 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
23390 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
233a0 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  on(sqlite3 *db, 
233b0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
233c0 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20   if( p->wsFlags 
233d0 26 20 28 57 48 45 52 45 5f 56 49 52 54 55 41 4c  & (WHERE_VIRTUAL
233e0 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f  TABLE|WHERE_AUTO
233f0 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 69  _INDEX) ){.    i
23400 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
23410 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
23420 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e  BLE)!=0 && p->u.
23430 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
23440 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
23450 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64  ree(p->u.vtab.id
23460 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  xStr);.      p->
23470 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
23480 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  = 0;.      p->u.
23490 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b  vtab.idxStr = 0;
234a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
234b0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
234c0 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
234d0 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e  0 && p->u.btree.
234e0 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20  pIndex!=0 ){.   
234f0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
23500 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  (db, p->u.btree.
23510 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29  pIndex->zColAff)
23520 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b  ;.      sqlite3K
23530 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 2d 3e 75  eyInfoUnref(p->u
23540 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 70  .btree.pIndex->p
23550 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  KeyInfo);.      
23560 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23570 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  , p->u.btree.pIn
23580 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75  dex);.      p->u
23590 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
235a0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
235b0 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
235c0 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79   internal memory
235d0 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72 65   used by a Where
235e0 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
235f0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
23600 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74 65  LoopClear(sqlite
23610 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
23620 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61   *p){.  if( p->a
23630 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d  LTerm!=p->aLTerm
23640 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33 44  Space ) sqlite3D
23650 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54  bFree(db, p->aLT
23660 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  erm);.  whereLoo
23670 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20  pClearUnion(db, 
23680 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49  p);.  whereLoopI
23690 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nit(p);.}../*.**
236a0 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d 65   Increase the me
236b0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
236c0 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  for pLoop->aLTer
236d0 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65 61  m[] to be at lea
236e0 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  st n..*/.static 
236f0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  int whereLoopRes
23700 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ize(sqlite3 *db,
23710 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69   WhereLoop *p, i
23720 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54 65  nt n){.  WhereTe
23730 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66  rm **paNew;.  if
23740 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29  ( p->nLSlot>=n )
23750 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23760 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e  K;.  n = (n+7)&~
23770 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71 6c  7;.  paNew = sql
23780 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
23790 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  db, sizeof(p->aL
237a0 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69  Term[0])*n);.  i
237b0 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65  f( paNew==0 ) re
237c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
237d0 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65  M;.  memcpy(paNe
237e0 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69  w, p->aLTerm, si
237f0 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30  zeof(p->aLTerm[0
23800 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20  ])*p->nLSlot);. 
23810 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
23820 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
23830 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
23840 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
23850 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e   p->aLTerm = paN
23860 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20  ew;.  p->nLSlot 
23870 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = n;.  return SQ
23880 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
23890 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65  * Transfer conte
238a0 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  nt from the seco
238b0 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68  nd pLoop into th
238c0 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74  e first..*/.stat
238d0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
238e0 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  Xfer(sqlite3 *db
238f0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f  , WhereLoop *pTo
23900 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72  , WhereLoop *pFr
23910 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  om){.  whereLoop
23920 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70  ClearUnion(db, p
23930 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65  To);.  if( where
23940 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
23950 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72  To, pFrom->nLTer
23960 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  m) ){.    memset
23970 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a  (&pTo->u, 0, siz
23980 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20  eof(pTo->u));.  
23990 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
239a0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
239b0 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20  cpy(pTo, pFrom, 
239c0 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f  WHERE_LOOP_XFER_
239d0 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  SZ);.  memcpy(pT
239e0 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d  o->aLTerm, pFrom
239f0 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e  ->aLTerm, pTo->n
23a00 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f  LTerm*sizeof(pTo
23a10 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20  ->aLTerm[0]));. 
23a20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c   if( pFrom->wsFl
23a30 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
23a40 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20  UALTABLE ){.    
23a50 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65  pFrom->u.vtab.ne
23a60 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  edFree = 0;.  }e
23a70 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e  lse if( (pFrom->
23a80 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
23a90 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
23aa0 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62  {.    pFrom->u.b
23ab0 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
23ac0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
23ad0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
23ae0 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65 72 65  * Delete a Where
23af0 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
23b00 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
23b10 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69 74  LoopDelete(sqlit
23b20 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
23b30 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f  p *p){.  whereLo
23b40 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a  opClear(db, p);.
23b50 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
23b60 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
23b70 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66   Free a WhereInf
23b80 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73  o structure.*/.s
23b90 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
23ba0 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33  InfoFree(sqlite3
23bb0 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20   *db, WhereInfo 
23bc0 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20  *pWInfo){.  if( 
23bd0 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29  ALWAYS(pWInfo) )
23be0 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
23bf0 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e  eClear(&pWInfo->
23c00 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  sWC);.    while(
23c10 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
23c20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f  ){.      WhereLo
23c30 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  op *p = pWInfo->
23c40 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57  pLoops;.      pW
23c50 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70  Info->pLoops = p
23c60 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
23c70 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65     whereLoopDele
23c80 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d  te(db, p);.    }
23c90 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
23ca0 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
23cb0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
23cc0 75 72 6e 20 54 52 55 45 20 69 66 20 62 6f 74 68  urn TRUE if both
23cd0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
23ce0 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
23cf0 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20 74  *   (1)  X has t
23d00 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
23d10 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20   cost that Y.** 
23d20 20 20 28 32 29 20 20 58 20 69 73 20 61 20 70 72    (2)  X is a pr
23d30 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
23d40 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f 70 65  .**.** By "prope
23d50 72 20 73 75 62 73 65 74 22 20 77 65 20 6d 65 61  r subset" we mea
23d60 6e 20 74 68 61 74 20 58 20 75 73 65 73 20 66 65  n that X uses fe
23d70 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  wer WHERE clause
23d80 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e 20 59   terms.** than Y
23d90 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79 20   and that every 
23da0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
23db0 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 20 61  m used by X is a
23dc0 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79 20 59  lso used.** by Y
23dd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20  ..**.** If X is 
23de0 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
23df0 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73 20 61  of Y then Y is a
23e00 20 62 65 74 74 65 72 20 63 68 6f 69 63 65 20 61   better choice a
23e10 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68  nd ought.** to h
23e20 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74  ave a lower cost
23e30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
23e40 72 65 74 75 72 6e 73 20 54 52 55 45 20 77 68 65  returns TRUE whe
23e50 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20  n that cost .** 
23e60 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73 20  relationship is 
23e70 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65 65  inverted and nee
23e80 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65  ds to be adjuste
23e90 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
23ea0 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65   whereLoopCheape
23eb0 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 0a 20  rProperSubset(. 
23ec0 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
23ed0 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a 20 46   *pX,       /* F
23ee0 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 74  irst WhereLoop t
23ef0 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63  o compare */.  c
23f00 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
23f10 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  pY        /* Com
23f20 70 61 72 65 20 61 67 61 69 6e 73 74 20 74 68 69  pare against thi
23f30 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29  s WhereLoop */.)
23f40 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
23f50 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70  if( pX->nLTerm-p
23f60 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59 2d 3e  X->nSkip >= pY->
23f70 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70  nLTerm-pY->nSkip
23f80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
23f90 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20 61 20  ; /* X is not a 
23fa0 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f 0a 20  subset of Y */. 
23fb0 20 7d 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75   }.  if( pX->rRu
23fc0 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b  n >= pY->rRun ){
23fd0 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75  .    if( pX->rRu
23fe0 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72  n > pY->rRun ) r
23ff0 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58  eturn 0;    /* X
24000 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
24010 20 59 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58   Y */.    if( pX
24020 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75  ->nOut > pY->nOu
24030 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
24040 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65   /* X costs more
24050 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20   than Y */.  }. 
24060 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72   for(i=pX->nLTer
24070 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  m-1; i>=0; i--){
24080 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 61 4c 54  .    if( pX->aLT
24090 65 72 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  erm[i]==0 ) cont
240a0 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  inue;.    for(j=
240b0 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e  pY->nLTerm-1; j>
240c0 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; j--){.      
240d0 69 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a  if( pY->aLTerm[j
240e0 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d  ]==pX->aLTerm[i]
240f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
24100 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65      if( j<0 ) re
24110 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f  turn 0;  /* X no
24120 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20  t a subset of Y 
24130 73 69 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20  since term X[i] 
24140 6e 6f 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f  not used by Y */
24150 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
24160 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69    /* All conditi
24170 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f  ons meet */.}../
24180 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 61 64 6a 75  *.** Try to adju
24190 73 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 57  st the cost of W
241a0 68 65 72 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61  hereLoop pTempla
241b0 74 65 20 75 70 77 61 72 64 73 20 6f 72 20 64 6f  te upwards or do
241c0 77 6e 77 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68  wnwards so.** th
241d0 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  at:.**.**   (1) 
241e0 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20  pTemplate costs 
241f0 6c 65 73 73 20 74 68 61 6e 20 61 6e 79 20 6f 74  less than any ot
24200 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 74  her WhereLoops t
24210 68 61 74 20 61 72 65 20 61 20 70 72 6f 70 65 72  hat are a proper
24220 0a 2a 2a 20 20 20 20 20 20 20 73 75 62 73 65 74  .**       subset
24230 20 6f 66 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a   of pTemplate.**
24240 0a 2a 2a 20 20 20 28 32 29 20 70 54 65 6d 70 6c  .**   (2) pTempl
24250 61 74 65 20 63 6f 73 74 73 20 6d 6f 72 65 20 74  ate costs more t
24260 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68  han any other Wh
24270 65 72 65 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69  ereLoops for whi
24280 63 68 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20  ch pTemplate.** 
24290 20 20 20 20 20 20 69 73 20 61 20 70 72 6f 70 65        is a prope
242a0 72 20 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  r subset..**.** 
242b0 54 6f 20 73 61 79 20 22 57 68 65 72 65 4c 6f 6f  To say "WhereLoo
242c0 70 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20  p X is a proper 
242d0 73 75 62 73 65 74 20 6f 66 20 59 22 20 6d 65 61  subset of Y" mea
242e0 6e 73 20 74 68 61 74 20 58 20 75 73 65 73 20 66  ns that X uses f
242f0 65 77 65 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c  ewer.** WHERE cl
24300 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20  ause terms than 
24310 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79  Y and that every
24320 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
24330 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 0a  rm used by X is.
24340 2a 2a 20 61 6c 73 6f 20 75 73 65 64 20 62 79 20  ** also used by 
24350 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  Y..*/.static voi
24360 64 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73  d whereLoopAdjus
24370 74 43 6f 73 74 28 63 6f 6e 73 74 20 57 68 65 72  tCost(const Wher
24380 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c  eLoop *p, WhereL
24390 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
243a0 0a 20 20 69 66 28 20 28 70 54 65 6d 70 6c 61 74  .  if( (pTemplat
243b0 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
243c0 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29  RE_INDEXED)==0 )
243d0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b   return;.  for(;
243e0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f   p; p=p->pNextLo
243f0 6f 70 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  op){.    if( p->
24400 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d  iTab!=pTemplate-
24410 3e 69 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65  >iTab ) continue
24420 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73  ;.    if( (p->ws
24430 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
24440 44 45 58 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74  DEXED)==0 ) cont
24450 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 77 68  inue;.    if( wh
24460 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72  ereLoopCheaperPr
24470 6f 70 65 72 53 75 62 73 65 74 28 70 2c 20 70 54  operSubset(p, pT
24480 65 6d 70 6c 61 74 65 29 20 29 7b 0a 20 20 20 20  emplate) ){.    
24490 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d    /* Adjust pTem
244a0 70 6c 61 74 65 20 63 6f 73 74 20 64 6f 77 6e 77  plate cost downw
244b0 61 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69  ard so that it i
244c0 73 20 63 68 65 61 70 65 72 20 74 68 61 6e 20 69  s cheaper than i
244d0 74 73 20 0a 20 20 20 20 20 20 2a 2a 20 73 75 62  ts .      ** sub
244e0 73 65 74 20 70 2e 20 20 45 78 63 65 70 74 2c 20  set p.  Except, 
244f0 64 6f 20 6e 6f 74 20 61 64 6a 75 73 74 20 74 68  do not adjust th
24500 65 20 63 6f 73 74 20 65 73 74 69 6d 61 74 65 20  e cost estimate 
24510 64 6f 77 6e 77 61 72 64 20 66 6f 72 0a 20 20 20  downward for.   
24520 20 20 20 2a 2a 20 61 20 6c 6f 6f 70 20 74 68 61     ** a loop tha
24530 74 20 73 6b 69 70 73 20 6d 6f 72 65 20 63 6f 6c  t skips more col
24540 75 6d 6e 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69  umns. */.      i
24550 66 28 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 53  f( pTemplate->nS
24560 6b 69 70 3e 70 2d 3e 6e 53 6b 69 70 20 29 20 63  kip>p->nSkip ) c
24570 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 57  ontinue;.      W
24580 48 45 52 45 54 52 41 43 45 28 30 78 38 30 2c 28  HERETRACE(0x80,(
24590 22 73 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a  "subset cost adj
245a0 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f  ustment %d,%d to
245b0 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d,%d\n",.     
245c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245d0 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75    pTemplate->rRu
245e0 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  n, pTemplate->nO
245f0 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e  ut, p->rRun, p->
24600 6e 4f 75 74 2d 31 29 29 3b 0a 20 20 20 20 20 20  nOut-1));.      
24610 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
24620 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20  = p->rRun;.     
24630 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74   pTemplate->nOut
24640 20 3d 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a   = p->nOut - 1;.
24650 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68      }else if( wh
24660 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72  ereLoopCheaperPr
24670 6f 70 65 72 53 75 62 73 65 74 28 70 54 65 6d 70  operSubset(pTemp
24680 6c 61 74 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  late, p) ){.    
24690 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d    /* Adjust pTem
246a0 70 6c 61 74 65 20 63 6f 73 74 20 75 70 77 61 72  plate cost upwar
246b0 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  d so that it is 
246c0 63 6f 73 74 6c 69 65 72 20 74 68 61 6e 20 70 20  costlier than p 
246d0 73 69 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 70  since.      ** p
246e0 54 65 6d 70 6c 61 74 65 20 69 73 20 61 20 70 72  Template is a pr
246f0 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 70  oper subset of p
24700 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54   */.      WHERET
24710 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62 73  RACE(0x80,("subs
24720 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65  et cost adjustme
24730 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25  nt %d,%d to %d,%
24740 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
24750 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
24760 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54  mplate->rRun, pT
24770 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70  emplate->nOut, p
24780 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b  ->rRun, p->nOut+
24790 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  1));.      pTemp
247a0 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e  late->rRun = p->
247b0 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d  rRun;.      pTem
247c0 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d  plate->nOut = p-
247d0 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20 7d  >nOut + 1;.    }
247e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
247f0 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 6f 66  arch the list of
24800 20 57 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20 2a   WhereLoops in *
24810 70 70 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20 66  ppPrev looking f
24820 6f 72 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20  or one that can 
24830 62 65 0a 2a 2a 20 73 75 70 70 6c 61 6e 74 65 64  be.** supplanted
24840 20 62 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a   by pTemplate..*
24850 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  *.** Return NULL
24860 20 69 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   if the WhereLoo
24870 70 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  p list contains 
24880 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 61  an entry that ca
24890 6e 20 73 75 70 70 6c 61 6e 74 0a 2a 2a 20 70 54  n supplant.** pT
248a0 65 6d 70 6c 61 74 65 2c 20 69 6e 20 6f 74 68 65  emplate, in othe
248b0 72 20 77 6f 72 64 73 20 69 66 20 70 54 65 6d 70  r words if pTemp
248c0 6c 61 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65  late does not be
248d0 6c 6f 6e 67 20 6f 6e 20 74 68 65 20 6c 69 73 74  long on the list
248e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69 73  ..**.** If pX is
248f0 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61   a WhereLoop tha
24900 74 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20  t pTemplate can 
24910 73 75 70 70 6c 61 6e 74 2c 20 74 68 65 6e 20 72  supplant, then r
24920 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e  eturn the.** lin
24930 6b 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  k that points to
24940 20 70 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54   pX..**.** If pT
24950 65 6d 70 6c 61 74 65 20 63 61 6e 6e 6f 74 20 73  emplate cannot s
24960 75 70 70 6c 61 6e 74 20 61 6e 79 20 65 78 69 73  upplant any exis
24970 74 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20  ting element of 
24980 74 68 65 20 6c 69 73 74 20 62 75 74 20 6e 65 65  the list but nee
24990 64 73 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64 65  ds.** to be adde
249a0 64 20 74 6f 20 74 68 65 20 6c 69 73 74 2c 20 74  d to the list, t
249b0 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
249c0 6e 74 65 72 20 74 6f 20 74 68 65 20 74 61 69 6c  nter to the tail
249d0 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   of the list..*/
249e0 0a 73 74 61 74 69 63 20 57 68 65 72 65 4c 6f 6f  .static WhereLoo
249f0 70 20 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69 6e  p **whereLoopFin
24a00 64 4c 65 73 73 65 72 28 0a 20 20 57 68 65 72 65  dLesser(.  Where
24a10 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a 20  Loop **ppPrev,. 
24a20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
24a30 20 2a 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a 20   *pTemplate.){. 
24a40 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20   WhereLoop *p;. 
24a50 20 66 6f 72 28 70 3d 28 2a 70 70 50 72 65 76 29   for(p=(*ppPrev)
24a60 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e  ; p; ppPrev=&p->
24a70 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70  pNextLoop, p=*pp
24a80 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70  Prev){.    if( p
24a90 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74  ->iTab!=pTemplat
24aa0 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53  e->iTab || p->iS
24ab0 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74  ortIdx!=pTemplat
24ac0 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a 20  e->iSortIdx ){. 
24ad0 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65       /* If eithe
24ae0 72 20 74 68 65 20 69 54 61 62 20 6f 72 20 69 53  r the iTab or iS
24af0 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20 66 6f  ortIdx values fo
24b00 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20  r two WhereLoop 
24b10 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20  are different.  
24b20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73      ** then thos
24b30 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65  e WhereLoops nee
24b40 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72  d to be consider
24b50 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
24b60 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20 20 20  Neither is.     
24b70 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74 65 20   ** a candidate 
24b80 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f  to replace the o
24b90 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63  ther. */.      c
24ba0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
24bb0 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72     /* In the cur
24bc0 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
24bd0 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75 70 20  ion, the rSetup 
24be0 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20  value is either 
24bf0 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74  zero.    ** or t
24c00 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69 6c 64  he cost of build
24c10 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
24c20 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61   index (NlogN) a
24c30 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20  nd the NlogN.   
24c40 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20   ** is the same 
24c50 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65 20 57  for compatible W
24c60 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20  hereLoops. */.  
24c70 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65    assert( p->rSe
24c80 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c  tup==0 || pTempl
24c90 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a  ate->rSetup==0 .
24ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cb0 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70   || p->rSetup==p
24cc0 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
24cd0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72   );..    /* wher
24ce0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 29 20  eLoopAddBtree() 
24cf0 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74 65 73  always generates
24d00 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74 68 65   and inserts the
24d10 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
24d20 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66 69 72  .    ** case fir
24d30 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70 61  st.  Hence compa
24d40 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74 65 20  tible candidate 
24d50 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72  WhereLoops never
24d60 20 68 61 76 65 20 61 20 6c 61 72 67 65 72 0a 20   have a larger. 
24d70 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20 43 61     ** rSetup. Ca
24d80 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d 49 4e  ll this SETUP-IN
24d90 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61  VARIANT */.    a
24da0 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
24db0 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  >=pTemplate->rSe
24dc0 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  tup );..    /* A
24dd0 6e 79 20 6c 6f 6f 70 20 75 73 69 6e 67 20 61 6e  ny loop using an
24de0 20 61 70 70 6c 69 61 74 69 6f 6e 2d 64 65 66 69   appliation-defi
24df0 6e 65 64 20 69 6e 64 65 78 20 28 6f 72 20 50 52  ned index (or PR
24e00 49 4d 41 52 59 20 4b 45 59 20 6f 72 0a 20 20 20  IMARY KEY or.   
24e10 20 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   ** UNIQUE const
24e20 72 61 69 6e 74 29 20 77 69 74 68 20 6f 6e 65 20  raint) with one 
24e30 6f 72 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73 74  or more == const
24e40 72 61 69 6e 74 73 20 69 73 20 62 65 74 74 65 72  raints is better
24e50 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 61 6e 20  .    ** than an 
24e60 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
24e70 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   */.    if( (p->
24e80 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
24e90 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a 20  AUTO_INDEX)!=0. 
24ea0 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74      && (pTemplat
24eb0 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
24ec0 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
24ed0 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74      && (pTemplat
24ee0 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
24ef0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30  RE_COLUMN_EQ)!=0
24f00 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 70 72 65  .     && (p->pre
24f10 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d  req & pTemplate-
24f20 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c  >prereq)==pTempl
24f30 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20  ate->prereq.    
24f40 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
24f50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
24f60 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
24f70 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20  oop p is better 
24f80 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20  than pTemplate, 
24f90 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 62 65  pTemplate can be
24fa0 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 65  .    ** discarde
24fb0 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 70 20  d.  WhereLoop p 
24fc0 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a 20 20  is better if:.  
24fd0 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20 68 61    **   (1)  p ha
24fe0 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64  s no more depend
24ff0 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54 65 6d  encies than pTem
25000 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a  plate, and.    *
25010 2a 20 20 20 28 32 29 20 20 70 20 68 61 73 20 61  *   (2)  p has a
25020 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72  n equal or lower
25030 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65 6d 70   cost than pTemp
25040 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  late.    */.    
25050 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26  if( (p->prereq &
25060 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
25070 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20  eq)==p->prereq  
25080 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20    /* (1)  */.   
25090 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d    && p->rSetup<=
250a0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
250b0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
250c0 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20     /* (2a) */.  
250d0 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70     && p->rRun<=p
250e0 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20  Template->rRun  
250f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25100 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20      /* (2b) */. 
25110 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d      && p->nOut<=
25120 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20  pTemplate->nOut 
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25140 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a       /* (2c) */.
25150 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
25160 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63 61  urn 0;  /* Disca
25170 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  rd pTemplate */.
25180 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
25190 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 6c   pTemplate is al
251a0 77 61 79 73 20 62 65 74 74 65 72 20 74 68 61 6e  ways better than
251b0 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65 20 70   p, then cause p
251c0 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74   to be overwritt
251d0 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 70  en.    ** with p
251e0 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d 70  Template.  pTemp
251f0 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 20 74  late is better t
25200 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a  han p if:.    **
25210 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c 61 74     (1)  pTemplat
25220 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65  e has no more de
25230 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e 20 70  pendences than p
25240 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28  , and.    **   (
25250 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61  2)  pTemplate ha
25260 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f  s an equal or lo
25270 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 2e  wer cost than p.
25280 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
25290 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65  (p->prereq & pTe
252a0 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d  mplate->prereq)=
252b0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72  =pTemplate->prer
252c0 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a  eq   /* (1)  */.
252d0 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e       && p->rRun>
252e0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e  =pTemplate->rRun
252f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25310 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20  (2a) */.     && 
25320 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61  p->nOut>=pTempla
25330 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20  te->nOut        
25340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25350 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a       /* (2b) */.
25360 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
25370 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d  ert( p->rSetup>=
25380 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
25390 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e  p ); /* SETUP-IN
253a0 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f  VARIANT above */
253b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 20  .      break;   
253c0 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20 62 65  /* Cause p to be
253d0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20   overwritten by 
253e0 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20  pTemplate */.   
253f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
25400 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ppPrev;.}../*.**
25410 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61   Insert or repla
25420 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65  ce a WhereLoop e
25430 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 74  ntry using the t
25440 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64  emplate supplied
25450 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74  ..**.** An exist
25460 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  ing WhereLoop en
25470 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65  try might be ove
25480 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20  rwritten if the 
25490 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20  new template.** 
254a0 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68 61  is better and ha
254b0 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  s fewer dependen
254c0 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65  cies.  Or the te
254d0 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69  mplate will be i
254e0 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f  gnored.** and no
254f0 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63   insert will occ
25500 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ur if an existin
25510 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66  g WhereLoop is f
25520 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a  aster and has.**
25530 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
25540 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d  ies than the tem
25550 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73  plate.  Otherwis
25560 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
25570 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61  p is.** added ba
25580 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c  sed on the templ
25590 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42  ate..**.** If pB
255a0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
255b0 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
255c0 77 65 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e  we care about on
255d0 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71  ly the.** prereq
255e0 75 69 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e  uisites and rRun
255f0 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20   and nOut costs 
25600 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f  of the N best lo
25610 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e  ops.  That.** in
25620 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74  formation is gat
25630 68 65 72 65 64 20 69 6e 20 74 68 65 20 70 42 75  hered in the pBu
25640 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62  ilder->pOrSet ob
25650 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70 65 63  ject.  This spec
25660 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e  ial.** processin
25670 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f  g mode is used o
25680 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73  nly for OR claus
25690 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
256a0 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c  .** When accumul
256b0 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c  ating multiple l
256c0 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c  oops (when pBuil
256d0 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e  der->pOrSet is N
256e0 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c  ULL) we.** still
256f0 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65   might overwrite
25700 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77   similar loops w
25710 69 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70  ith the new temp
25720 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e  late if the.** n
25730 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62  ew template is b
25740 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61  etter.  Loops ma
25750 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  y be overwritten
25760 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
25770 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  g .** conditions
25780 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
25790 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76     (1)  They hav
257a0 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e  e the same iTab.
257b0 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79  .**    (2)  They
257c0 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69   have the same i
257d0 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28  SortIdx..**    (
257e0 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  3)  The template
257f0 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77   has same or few
25800 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
25810 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
25820 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20   loop.**    (4) 
25830 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
25840 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
25850 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68  wer cost than th
25860 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
25870 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
25880 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65  reLoopInsert(Whe
25890 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
258a0 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f  Builder, WhereLo
258b0 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a  op *pTemplate){.
258c0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
258d0 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72  Prev, *p;.  Wher
258e0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
258f0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
25900 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
25910 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
25920 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ->db;..  /* If p
25930 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
25940 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  is defined, then
25950 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b   only keep track
25960 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20   of the costs.  
25970 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a  ** and prereqs..
25980 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c    */.  if( pBuil
25990 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29  der->pOrSet!=0 )
259a0 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  {.#if WHERETRACE
259b0 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 75 31 36  _ENABLED.    u16
259c0 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70   n = pBuilder->p
259d0 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e  OrSet->n;.    in
259e0 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20  t x =.#endif.   
259f0 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70   whereOrInsert(p
25a00 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c  Builder->pOrSet,
25a10 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
25a20 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72  eq, pTemplate->r
25a30 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Run,.           
25a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a50 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
25a60 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57  te->nOut);.#if W
25a70 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
25a80 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
25a90 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
25aa0 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
25ab0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
25ac0 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72  gPrintf(x?"   or
25ad0 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58  -%d:  ":"   or-X
25ae0 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20  :  ", n);.      
25af0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
25b00 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
25b10 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a  er->pWC);.    }.
25b20 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
25b30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
25b40 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20  ..  /* Look for 
25b50 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  an existing Wher
25b60 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65  eLoop to replace
25b70 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a   with pTemplate.
25b80 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70    */.  whereLoop
25b90 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66  AdjustCost(pWInf
25ba0 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70  o->pLoops, pTemp
25bb0 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20  late);.  ppPrev 
25bc0 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  = whereLoopFindL
25bd0 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70  esser(&pWInfo->p
25be0 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65  Loops, pTemplate
25bf0 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76  );..  if( ppPrev
25c00 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
25c10 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ere already exis
25c20 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ts a WhereLoop o
25c30 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20  n the list that 
25c40 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a  is better.    **
25c50 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c   than pTemplate,
25c60 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20   so just ignore 
25c70 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66  pTemplate */.#if
25c80 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
25c90 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20  LED /* 0x8 */.  
25ca0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
25cb0 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
25cc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
25cd0 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 73 6b  bugPrintf("   sk
25ce0 69 70 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68  ip: ");.      wh
25cf0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
25d00 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72  mplate, pBuilder
25d10 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65  ->pWC);.    }.#e
25d20 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
25d30 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d  SQLITE_OK;  .  }
25d40 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70  else{.    p = *p
25d50 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pPrev;.  }..  /*
25d60 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
25d70 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73  s point it means
25d80 20 74 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d   that either p[]
25d90 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77   should be overw
25da0 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68  ritten.  ** with
25db0 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20   pTemplate[] if 
25dc0 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69  p[] exists, or i
25dd0 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61  f p==NULL then a
25de0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20  llocate a new.  
25df0 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64  ** WhereLoop and
25e00 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f   insert it..  */
25e10 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
25e20 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
25e30 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  /.  if( sqlite3W
25e40 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
25e50 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20  ){.    if( p!=0 
25e60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
25e70 44 65 62 75 67 50 72 69 6e 74 66 28 22 72 65 70  DebugPrintf("rep
25e80 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20 20 20 20  lace: ");.      
25e90 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
25ea0 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
25eb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
25ec0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25ed0 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20 20 20      add: ");.   
25ee0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
25ef0 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c  pTemplate, pBuil
25f00 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23  der->pWC);.  }.#
25f10 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30  endif.  if( p==0
25f20 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63   ){.    /* Alloc
25f30 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c  ate a new WhereL
25f40 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68  oop to add to th
25f50 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73  e end of the lis
25f60 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76  t */.    *ppPrev
25f70 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62   = p = sqlite3Db
25f80 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
25f90 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
25fa0 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
25fb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
25fc0 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c  OMEM;.    whereL
25fd0 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20  oopInit(p);.    
25fe0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30  p->pNextLoop = 0
25ff0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
26000 2a 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65  * We will be ove
26010 72 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f  rwriting WhereLo
26020 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66  op p[].  But bef
26030 6f 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74  ore we do, first
26040 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75  .    ** go throu
26050 67 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  gh the rest of t
26060 68 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65  he list and dele
26070 74 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74  te any other ent
26080 72 69 65 73 20 62 65 73 69 64 65 73 0a 20 20 20  ries besides.   
26090 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65   ** p[] that are
260a0 20 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20   also supplated 
260b0 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  by pTemplate */.
260c0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a      WhereLoop **
260d0 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65  ppTail = &p->pNe
260e0 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72  xtLoop;.    Wher
260f0 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20  eLoop *pToDel;. 
26100 20 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69     while( *ppTai
26110 6c 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69  l ){.      ppTai
26120 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e  l = whereLoopFin
26130 64 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20  dLesser(ppTail, 
26140 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20  pTemplate);.    
26150 20 20 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20    if( ppTail==0 
26160 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
26170 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b  ToDel = *ppTail;
26180 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 44 65  .      if( pToDe
26190 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==0 ) break;.  
261a0 20 20 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54      *ppTail = pT
261b0 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b  oDel->pNextLoop;
261c0 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
261d0 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
261e0 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
261f0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
26200 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73  0x8 ){.        s
26210 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
26220 66 28 22 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a  f(" delete: ");.
26230 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
26240 70 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70  pPrint(pToDel, p
26250 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
26260 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
26270 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c      whereLoopDel
26280 65 74 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b  ete(db, pToDel);
26290 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 65  .    }.  }.  whe
262a0 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70  reLoopXfer(db, p
262b0 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20  , pTemplate);.  
262c0 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
262d0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
262e0 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
262f0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
26300 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
26310 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  x;.    if( pInde
26320 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75  x && pIndex->tnu
26330 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  m==0 ){.      p-
26340 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
26350 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
26360 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26370 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  K;.}../*.** Adju
26380 73 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  st the WhereLoop
26390 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e  .nOut value down
263a0 77 61 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20  ward to account 
263b0 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
263c0 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
263d0 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
263e0 74 68 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69  the loop but whi
263f0 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ch are not used 
26400 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a  by an.** index..
26410 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 75 72  **.** In the cur
26420 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
26430 69 6f 6e 2c 20 74 68 65 20 66 69 72 73 74 20 65  ion, the first e
26440 78 74 72 61 20 57 48 45 52 45 20 63 6c 61 75 73  xtra WHERE claus
26450 65 20 74 65 72 6d 20 72 65 64 75 63 65 73 0a 2a  e term reduces.*
26460 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
26470 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79 20 61  output rows by a
26480 20 66 61 63 74 6f 72 20 6f 66 20 31 30 20 61 6e   factor of 10 an
26490 64 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61  d each additiona
264a0 6c 20 74 65 72 6d 0a 2a 2a 20 72 65 64 75 63 65  l term.** reduce
264b0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
264c0 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79 20 73  output rows by s
264d0 71 72 74 28 32 29 2e 0a 2a 2f 0a 73 74 61 74 69  qrt(2)..*/.stati
264e0 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
264f0 4f 75 74 70 75 74 41 64 6a 75 73 74 28 0a 20 20  OutputAdjust(.  
26500 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
26510 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  ,      /* The WH
26520 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
26530 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
26540 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f  ,      /* The lo
26550 6f 70 20 74 6f 20 61 64 6a 75 73 74 20 64 6f 77  op to adjust dow
26560 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73  nward */.  LogEs
26570 74 20 6e 52 6f 77 20 20 20 20 20 20 20 20 20 20  t nRow          
26580 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
26590 6f 77 73 20 69 6e 20 74 68 65 20 65 6e 74 69 72  ows in the entir
265a0 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
265b0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
265c0 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b  , *pX;.  Bitmask
265d0 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28   notAllowed = ~(
265e0 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c  pLoop->prereq|pL
265f0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a  oop->maskSelf);.
26600 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
26610 74 20 6e 45 71 20 3d 20 30 3b 20 20 20 20 2f 2a  t nEq = 0;    /*
26620 20 4e 75 6d 62 65 72 20 6f 66 20 3d 20 63 6f 6e   Number of = con
26630 73 74 72 61 69 6e 74 73 20 6e 6f 74 20 77 69 74  straints not wit
26640 68 69 6e 20 6c 69 6b 65 6c 79 28 29 2f 75 6e 6c  hin likely()/unl
26650 69 6b 65 6c 79 28 29 20 2a 2f 0a 0a 20 20 66 6f  ikely() */..  fo
26660 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20  r(i=pWC->nTerm, 
26670 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e  pTerm=pWC->a; i>
26680 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; i--, pTerm++)
26690 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
266a0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
266b0 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62  _VIRTUAL)!=0 ) b
266c0 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70  reak;.    if( (p
266d0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
266e0 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
266f0 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  f)==0 ) continue
26700 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
26710 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
26720 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63  tAllowed)!=0 ) c
26730 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
26740 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d  (j=pLoop->nLTerm
26750 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
26760 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70        pX = pLoop
26770 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
26780 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63     if( pX==0 ) c
26790 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
267a0 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62  f( pX==pTerm ) b
267b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
267c0 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26  pX->iParent>=0 &
267d0 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69  & (&pWC->a[pX->i
267e0 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20  Parent])==pTerm 
267f0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
26800 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20     if( j<0 ){.  
26810 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
26820 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20  ruthProb<=0 ){. 
26830 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
26840 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  ut += pTerm->tru
26850 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 7d 65  thProb;.      }e
26860 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  lse{.        pLo
26870 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20  op->nOut--;.    
26880 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
26890 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 20 29  Operator&WO_EQ )
268a0 20 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a   nEq++;.      }.
268b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 54      }.  }.  /* T
268c0 55 4e 49 4e 47 3a 20 20 49 66 20 74 68 65 72 65  UNING:  If there
268d0 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   is at least one
268e0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
268f0 61 69 6e 74 20 69 6e 20 74 68 65 20 57 48 45 52  aint in the WHER
26900 45 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 74 68  E.  ** clause th
26910 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  at does not have
26920 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20   a likelihood() 
26930 65 78 70 6c 69 63 69 74 6c 79 20 61 73 73 69 67  explicitly assig
26940 6e 65 64 20 74 6f 20 69 74 0a 20 20 2a 2a 20 74  ned to it.  ** t
26950 68 65 6e 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74  hen do not let t
26960 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
26970 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
26980 77 73 20 65 78 63 65 65 64 20 68 61 6c 66 20 0a  ws exceed half .
26990 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
269a0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
269b0 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  able. */.  if( n
269c0 45 71 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  Eq && pLoop->nOu
269d0 74 3e 6e 52 6f 77 2d 31 30 20 29 7b 0a 20 20 20  t>nRow-10 ){.   
269e0 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e   pLoop->nOut = n
269f0 52 6f 77 20 2d 20 31 30 3b 0a 20 20 7d 0a 7d 0a  Row - 10;.  }.}.
26a00 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
26a10 65 20 63 6f 73 74 20 43 20 62 79 20 74 68 65 20  e cost C by the 
26a20 63 6f 73 74 4d 75 6c 74 20 66 61 63 74 65 72 20  costMult facter 
26a30 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63  T.  This only oc
26a40 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  curs if.** compi
26a50 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c 49 54  led with -DSQLIT
26a60 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c  E_ENABLE_COSTMUL
26a70 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  T.*/.#ifdef SQLI
26a80 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55  TE_ENABLE_COSTMU
26a90 4c 54 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c  LT.# define Appl
26aa0 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
26ab0 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c  C,T)  C += T.#el
26ac0 73 65 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c  se.# define Appl
26ad0 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
26ae0 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  C,T).#endif../*.
26af0 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66 61  ** We have so fa
26b00 72 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64  r matched pBuild
26b10 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
26b20 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74  e.nEq terms of t
26b30 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e  he .** index pIn
26b40 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74 63  dex. Try to matc
26b50 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a  h one more..**.*
26b60 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
26b70 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
26b80 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
26b90 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  nOut contains th
26ba0 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  e .** number of 
26bb0 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f  rows expected to
26bc0 20 62 65 20 76 69 73 69 74 65 64 20 62 79 20 66   be visited by f
26bd0 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20 74  iltering using t
26be0 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73  he nEq .** terms
26bf0 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73 20   only. If it is 
26c00 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20 76  modified, this v
26c10 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65 64  alue is restored
26c20 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a   before this .**
26c30 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
26c40 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f  s..**.** If pPro
26c50 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61  be->tnum==0, tha
26c60 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69  t means pIndex i
26c70 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75  s a fake index u
26c80 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49  sed for the.** I
26c90 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
26ca0 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EY..*/.static in
26cb0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
26cc0 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  reeIndex(.  Wher
26cd0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
26ce0 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54  uilder,     /* T
26cf0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63  he WhereLoop fac
26d00 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  tory */.  struct
26d10 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
26d20 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  Src,      /* FRO
26d30 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
26d40 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
26d50 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c    Index *pProbe,
26d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d70 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
26d80 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73   pSrc */.  LogEs
26d90 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20  t nInMul        
26da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
26db0 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  g(Number of iter
26dc0 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e  ations due to IN
26dd0 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  ) */.){.  WhereI
26de0 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
26df0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20  uilder->pWInfo; 
26e00 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
26e10 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  e context */.  P
26e20 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
26e30 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
26e40 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
26e50 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
26e60 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
26e70 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a  se->db;       /*
26e80 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
26e90 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74  tion malloc cont
26ea0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
26eb0 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
26ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
26ed0 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75  late WhereLoop u
26ee0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
26ef0 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
26f00 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
26f10 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72         /* A Wher
26f20 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73  eTerm under cons
26f30 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  ideration */.  i
26f40 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20  nt opMask;      
26f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26f60 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72  * Valid operator
26f70 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  s for constraint
26f80 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e  s */.  WhereScan
26f90 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20   scan;          
26fa0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
26fb0 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72  or for WHERE ter
26fc0 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
26fd0 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20  saved_prereq;   
26fe0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
26ff0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
27000 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75  w->prereq */.  u
27010 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b  16 saved_nLTerm;
27020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27030 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
27040 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d   of pNew->nLTerm
27050 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
27060 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
27070 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
27080 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
27090 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a  >u.btree.nEq */.
270a0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69    u16 saved_nSki
270b0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
270c0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
270d0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b  lue of pNew->nSk
270e0 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65  ip */.  u32 save
270f0 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20  d_wsFlags;      
27100 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
27110 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
27120 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20  w->wsFlags */.  
27130 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75  LogEst saved_nOu
27140 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
27150 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
27160 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
27170 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
27180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27190 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
271a0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74   the column in t
271b0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
271c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
271d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
271e0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
271f0 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20    LogEst rSize; 
27200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27210 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
27220 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
27230 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f   */.  LogEst rLo
27240 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
27250 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74        /* Logarit
27260 68 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65  hm of table size
27270 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
27280 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d  *pTop = 0, *pBtm
27290 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64   = 0; /* Top and
272a0 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f   bottom range co
272b0 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20  nstraints */..  
272c0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
272d0 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d  >pNew;.  if( db-
272e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
272f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
27300 4d 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  MEM;..  assert( 
27310 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
27320 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
27330 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  BLE)==0 );.  ass
27340 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c  ert( (pNew->wsFl
27350 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
27360 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69  LIMIT)==0 );.  i
27370 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  f( pNew->wsFlags
27380 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
27390 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b  IT ){.    opMask
273a0 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a   = WO_LT|WO_LE;.
273b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f    }else if( pPro
273c0 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28  be->tnum<=0 || (
273d0 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  pSrc->jointype &
273e0 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a   JT_LEFT)!=0 ){.
273f0 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
27400 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57  EQ|WO_IN|WO_GT|W
27410 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
27420 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
27430 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  pMask = WO_EQ|WO
27440 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  _IN|WO_ISNULL|WO
27450 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
27460 57 4f 5f 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28  WO_LE;.  }.  if(
27470 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65   pProbe->bUnorde
27480 72 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20  red ) opMask &= 
27490 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  ~(WO_GT|WO_GE|WO
274a0 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61  _LT|WO_LE);..  a
274b0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62  ssert( pNew->u.b
274c0 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d  tree.nEq<pProbe-
274d0 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 43  >nColumn );.  iC
274e0 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43  ol = pProbe->aiC
274f0 6f 6c 75 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74  olumn[pNew->u.bt
27500 72 65 65 2e 6e 45 71 5d 3b 0a 0a 20 20 70 54 65  ree.nEq];..  pTe
27510 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e  rm = whereScanIn
27520 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64  it(&scan, pBuild
27530 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69  er->pWC, pSrc->i
27540 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20  Cursor, iCol,.  
27550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27560 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50        opMask, pP
27570 72 6f 62 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e  robe);.  saved_n
27580 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72  Eq = pNew->u.btr
27590 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f  ee.nEq;.  saved_
275a0 6e 53 6b 69 70 20 3d 20 70 4e 65 77 2d 3e 6e 53  nSkip = pNew->nS
275b0 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54  kip;.  saved_nLT
275c0 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65  erm = pNew->nLTe
275d0 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73 46 6c  rm;.  saved_wsFl
275e0 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c  ags = pNew->wsFl
275f0 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70 72 65  ags;.  saved_pre
27600 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72  req = pNew->prer
27610 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74  eq;.  saved_nOut
27620 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20   = pNew->nOut;. 
27630 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
27640 30 3b 0a 20 20 72 53 69 7a 65 20 3d 20 70 50 72  0;.  rSize = pPr
27650 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
27660 5b 30 5d 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20  [0];.  rLogSize 
27670 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b  = estLog(rSize);
27680 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c  .  for(; rc==SQL
27690 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21  ITE_OK && pTerm!
276a0 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72  =0; pTerm = wher
276b0 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
276c0 29 7b 0a 20 20 20 20 75 31 36 20 65 4f 70 20 3d  ){.    u16 eOp =
276d0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
276e0 72 3b 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e  r;   /* Shorthan
276f0 64 20 66 6f 72 20 70 54 65 72 6d 2d 3e 65 4f 70  d for pTerm->eOp
27700 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f  erator */.    Lo
27710 67 45 73 74 20 72 43 6f 73 74 49 64 78 3b 0a 20  gEst rCostIdx;. 
27720 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 55 6e     LogEst nOutUn
27730 61 64 6a 75 73 74 65 64 3b 20 20 20 20 20 20 20  adjusted;       
27740 20 2f 2a 20 6e 4f 75 74 20 62 65 66 6f 72 65 20   /* nOut before 
27750 49 4e 28 29 20 61 6e 64 20 57 48 45 52 45 20 61  IN() and WHERE a
27760 64 6a 75 73 74 6d 65 6e 74 73 20 2a 2f 0a 20 20  djustments */.  
27770 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23    int nIn = 0;.#
27780 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
27790 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
277a0 54 34 0a 20 20 20 20 69 6e 74 20 6e 52 65 63 56  T4.    int nRecV
277b0 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d  alid = pBuilder-
277c0 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64  >nRecValid;.#end
277d0 69 66 0a 20 20 20 20 69 66 28 20 28 65 4f 70 3d  if.    if( (eOp=
277e0 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70  =WO_ISNULL || (p
277f0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45  Term->wtFlags&TE
27800 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20  RM_VNULL)!=0).  
27810 20 20 20 26 26 20 28 69 43 6f 6c 3c 30 20 7c 7c     && (iCol<0 ||
27820 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f   pSrc->pTab->aCo
27830 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 29  l[iCol].notNull)
27840 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f  .    ){.      co
27850 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72  ntinue; /* ignor
27860 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20  e IS [NOT] NULL 
27870 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e  constraints on N
27880 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
27890 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  */.    }.    if(
278a0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
278b0 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
278c0 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
278d0 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ..    pNew->wsFl
278e0 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
278f0 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ags;.    pNew->u
27900 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
27910 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77  ed_nEq;.    pNew
27920 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
27930 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28  _nLTerm;.    if(
27940 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
27950 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
27960 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65  >nLTerm+1) ) bre
27970 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20  ak; /* OOM */.  
27980 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70    pNew->aLTerm[p
27990 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d  New->nLTerm++] =
279a0 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77   pTerm;.    pNew
279b0 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76 65  ->prereq = (save
279c0 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d  d_prereq | pTerm
279d0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20 26  ->prereqRight) &
279e0 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66   ~pNew->maskSelf
279f0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ;..    assert( n
27a00 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20  InMul==0.       
27a10 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   || (pNew->wsFla
27a20 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
27a30 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20  N_NULL)!=0 .    
27a40 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73      || (pNew->ws
27a50 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
27a60 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20  LUMN_IN)!=0 .   
27a70 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
27a80 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  sFlags & WHERE_S
27a90 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20 20  KIPSCAN)!=0 .   
27aa0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f 70   );..    if( eOp
27ab0 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
27ac0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
27ad0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
27ae0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
27af0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
27b00 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20  N_IN;.      if( 
27b10 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
27b20 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
27b30 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
27b40 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  /* "x IN (SELECT
27b50 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a   ...)":  TUNING:
27b60 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75   the SELECT retu
27b70 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20  rns 25 rows */. 
27b80 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b         nIn = 46;
27b90 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71    assert( 46==sq
27ba0 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20  lite3LogEst(25) 
27bb0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
27bc0 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
27bd0 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70  >x.pList && pExp
27be0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
27bf0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
27c00 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76   "x IN (value, v
27c10 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20  alue, ...)" */. 
27c20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c         nIn = sql
27c30 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72  ite3LogEst(pExpr
27c40 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
27c50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
27c60 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30 20 29   assert( nIn>0 )
27c70 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61 79 73  ;  /* RHS always
27c80 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65 20 74   has 2 or more t
27c90 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61 72  erms...  The par
27ca0 73 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  ser.            
27cb0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63              ** c
27cc0 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f 29  hanges "x IN (?)
27cd0 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f  " into "x=?". */
27ce0 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ..    }else if( 
27cf0 65 4f 70 20 26 20 28 57 4f 5f 45 51 29 20 29 7b  eOp & (WO_EQ) ){
27d00 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
27d10 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
27d20 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69  LUMN_EQ;.      i
27d30 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 28 6e 49  f( iCol<0 || (nI
27d40 6e 4d 75 6c 3d 3d 30 20 26 26 20 70 4e 65 77 2d  nMul==0 && pNew-
27d50 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 70 50  >u.btree.nEq==pP
27d60 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29  robe->nKeyCol-1)
27d70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
27d80 69 43 6f 6c 3e 3d 30 20 26 26 20 21 49 73 55 6e  iCol>=0 && !IsUn
27d90 69 71 75 65 49 6e 64 65 78 28 70 50 72 6f 62 65  iqueIndex(pProbe
27da0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
27db0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
27dc0 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44  WHERE_UNQ_WANTED
27dd0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
27de0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
27df0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
27e00 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20  E_ONEROW;.      
27e10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27e20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20  }else if( eOp & 
27e30 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
27e40 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
27e50 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
27e60 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
27e70 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 47   if( eOp & (WO_G
27e80 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20  T|WO_GE) ){.    
27e90 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
27ea0 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20  & WO_GT );.     
27eb0 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
27ec0 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20   WO_GE );.      
27ed0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
27ee0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
27ef0 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49  NGE|WHERE_BTM_LI
27f00 4d 49 54 3b 0a 20 20 20 20 20 20 70 42 74 6d 20  MIT;.      pBtm 
27f10 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
27f20 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Top = 0;.    }el
27f30 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
27f40 28 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57  ( eOp & (WO_LT|W
27f50 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74  O_LE) );.      t
27f60 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
27f70 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  O_LT );.      te
27f80 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
27f90 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  _LE );.      pNe
27fa0 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
27fb0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
27fc0 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
27fd0 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70  ;.      pTop = p
27fe0 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d  Term;.      pBtm
27ff0 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67   = (pNew->wsFlag
28000 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
28010 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20  MIT)!=0 ?.      
28020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
28030 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
28040 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b  ->nLTerm-2] : 0;
28050 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
28060 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 4e 65  t this point pNe
28070 77 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74 20 74  w->nOut is set t
28080 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
28090 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f  rows expected to
280a0 0a 20 20 20 20 2a 2a 20 62 65 20 76 69 73 69 74  .    ** be visit
280b0 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 20  ed by the index 
280c0 73 63 61 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73  scan before cons
280d0 69 64 65 72 69 6e 67 20 74 65 72 6d 20 70 54 65  idering term pTe
280e0 72 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  rm, or the.    *
280f0 2a 20 76 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20  * values of nIn 
28100 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f  and nInMul. In o
28110 74 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75  ther words, assu
28120 6d 69 6e 67 20 74 68 61 74 20 61 6c 6c 20 0a 20  ming that all . 
28130 20 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29     ** "x IN(...)
28140 22 20 74 65 72 6d 73 20 61 72 65 20 72 65 70 6c  " terms are repl
28150 61 63 65 64 20 77 69 74 68 20 22 78 20 3d 20 3f  aced with "x = ?
28160 22 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 75 70  ". This block up
28170 64 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  dates.    ** the
28180 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
28190 6e 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e 74 20  nOut to account 
281a0 66 6f 72 20 70 54 65 72 6d 20 28 62 75 74 20 6e  for pTerm (but n
281b0 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20  ot nIn/nInMul). 
281c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
281d0 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65  pNew->nOut==save
281e0 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 69 66  d_nOut );.    if
281f0 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
28200 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  & WHERE_COLUMN_R
28210 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ANGE ){.      /*
28220 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 75 73 69   Adjust nOut usi
28230 6e 67 20 73 74 61 74 33 2f 73 74 61 74 34 20 64  ng stat3/stat4 d
28240 61 74 61 2e 20 4f 72 2c 20 69 66 20 74 68 65 72  ata. Or, if ther
28250 65 20 69 73 20 6e 6f 20 73 74 61 74 33 2f 73 74  e is no stat3/st
28260 61 74 34 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  at4.      ** dat
28270 61 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74  a, using some ot
28280 68 65 72 20 65 73 74 69 6d 61 74 65 2e 20 20 2a  her estimate.  *
28290 2f 0a 20 20 20 20 20 20 77 68 65 72 65 52 61 6e  /.      whereRan
282a0 67 65 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  geScanEst(pParse
282b0 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 42 74 6d  , pBuilder, pBtm
282c0 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20  , pTop, pNew);. 
282d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
282e0 69 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77  int nEq = ++pNew
282f0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
28300 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70       assert( eOp
28310 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f   & (WO_ISNULL|WO
28320 5f 45 51 7c 57 4f 5f 49 4e 29 20 29 3b 0a 0a 20  _EQ|WO_IN) );.. 
28330 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
28340 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e  w->nOut==saved_n
28350 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Out );.      if(
28360 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
28370 62 3c 3d 30 20 26 26 20 69 43 6f 6c 3e 3d 30 20  b<=0 && iCol>=0 
28380 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
28390 74 28 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29  t( (eOp & WO_IN)
283a0 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20   || nIn==0 );.  
283b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
283c0 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  eOp & WO_IN );. 
283d0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
283e0 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74  t += pTerm->trut
283f0 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 70  hProb;.        p
28400 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e  New->nOut -= nIn
28410 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23  ;.      }else{.#
28420 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
28430 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
28440 54 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63  T4.        tRowc
28450 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20  nt nOut = 0;.   
28460 20 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d       if( nInMul=
28470 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
28480 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20  pProbe->nSample 
28490 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65  .         && pNe
284a0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d  w->u.btree.nEq<=
284b0 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43  pProbe->nSampleC
284c0 6f 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ol.         && (
284d0 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30  (eOp & WO_IN)==0
284e0 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70   || !ExprHasProp
284f0 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
28500 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
28510 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
28520 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
28530 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
28540 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  r;.          if(
28550 20 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57   (eOp & (WO_EQ|W
28560 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b  O_ISNULL))!=0 ){
28570 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
28580 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
28590 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  EQ );.          
285a0 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
285b0 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  & WO_ISNULL );. 
285c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
285d0 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
285e0 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
285f0 65 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  er, pExpr->pRigh
28600 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20  t, &nOut);.     
28610 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28620 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
28630 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72  reInScanEst(pPar
28640 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45  se, pBuilder, pE
28650 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  xpr->x.pList, &n
28660 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Out);.          
28670 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
28680 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc==SQLITE_NOTFO
28690 55 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54  UND ) rc = SQLIT
286a0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
286b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
286c0 4b 20 29 20 62 72 65 61 6b 3b 20 20 20 20 20 20  K ) break;      
286d0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20      /* Jump out 
286e0 6f 66 20 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f  of the pTerm loo
286f0 70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  p */.          i
28700 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20  f( nOut ){.     
28710 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
28720 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
28730 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  t(nOut);.       
28740 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e       if( pNew->n
28750 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29  Out>saved_nOut )
28760 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
28770 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20  ved_nOut;.      
28780 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
28790 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20   -= nIn;.       
287a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
287b0 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 3d         if( nOut=
287c0 3d 30 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20  =0 ).#endif.    
287d0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
287e0 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70  pNew->nOut += (p
287f0 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
28800 73 74 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65  st[nEq] - pProbe
28810 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45  ->aiRowLogEst[nE
28820 71 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  q-1]);.         
28830 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53   if( eOp & WO_IS
28840 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
28850 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49      /* TUNING: I
28860 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69  f there is no li
28870 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65  kelihood() value
28880 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 20  , assume that a 
28890 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
288a0 22 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78  "col IS NULL" ex
288b0 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73  pression matches
288c0 20 74 77 69 63 65 20 61 73 20 6d 61 6e 79 20 72   twice as many r
288d0 6f 77 73 20 0a 20 20 20 20 20 20 20 20 20 20 20  ows .           
288e0 20 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20   ** as (col=?). 
288f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  */.            p
28900 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b  New->nOut += 10;
28910 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28930 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
28940 20 72 43 6f 73 74 49 64 78 20 74 6f 20 74 68 65   rCostIdx to the
28950 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e   cost of visitin
28960 67 20 73 65 6c 65 63 74 65 64 20 72 6f 77 73 20  g selected rows 
28970 69 6e 20 69 6e 64 65 78 2e 20 41 64 64 0a 20 20  in index. Add.  
28980 20 20 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d    ** it to pNew-
28990 3e 72 52 75 6e 2c 20 77 68 69 63 68 20 69 73 20  >rRun, which is 
289a0 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f  currently set to
289b0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65   the cost of the
289c0 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73 65   index.    ** se
289d0 65 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69  ek only. Then, i
289e0 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d  f this is a non-
289f0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20  covering index, 
28a00 61 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 0a  add the cost of.
28a10 20 20 20 20 2a 2a 20 76 69 73 69 74 69 6e 67 20      ** visiting 
28a20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20  the rows in the 
28a30 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  main table.  */.
28a40 20 20 20 20 72 43 6f 73 74 49 64 78 20 3d 20 70      rCostIdx = p
28a50 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20  New->nOut + 1 + 
28a60 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64  (15*pProbe->szId
28a70 78 52 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61 62  xRow)/pSrc->pTab
28a80 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20  ->szTabRow;.    
28a90 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
28aa0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c  ite3LogEstAdd(rL
28ab0 6f 67 53 69 7a 65 2c 20 72 43 6f 73 74 49 64 78  ogSize, rCostIdx
28ac0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77  );.    if( (pNew
28ad0 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
28ae0 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52  RE_IDX_ONLY|WHER
28af0 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20  E_IPK))==0 ){.  
28b00 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
28b10 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
28b20 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e  d(pNew->rRun, pN
28b30 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a  ew->nOut + 16);.
28b40 20 20 20 20 7d 0a 20 20 20 20 41 70 70 6c 79 43      }.    ApplyC
28b50 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e  ostMultiplier(pN
28b60 65 77 2d 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65  ew->rRun, pProbe
28b70 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75  ->pTable->costMu
28b80 6c 74 29 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e  lt);..    nOutUn
28b90 61 64 6a 75 73 74 65 64 20 3d 20 70 4e 65 77 2d  adjusted = pNew-
28ba0 3e 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d  >nOut;.    pNew-
28bb0 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20  >rRun += nInMul 
28bc0 2b 20 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d  + nIn;.    pNew-
28bd0 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20  >nOut += nInMul 
28be0 2b 20 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72 65  + nIn;.    where
28bf0 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
28c00 28 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20  (pBuilder->pWC, 
28c10 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20  pNew, rSize);.  
28c20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
28c30 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
28c40 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28   pNew);..    if(
28c50 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26   pNew->wsFlags &
28c60 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
28c70 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  NGE ){.      pNe
28c80 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
28c90 6e 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nOut;.    }else{
28ca0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
28cb0 74 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74  t = nOutUnadjust
28cc0 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ed;.    }..    i
28cd0 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  f( (pNew->wsFlag
28ce0 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
28cf0 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  MIT)==0.     && 
28d00 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
28d10 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  q<pProbe->nColum
28d20 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77  n.    ){.      w
28d30 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
28d40 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20  Index(pBuilder, 
28d50 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49  pSrc, pProbe, nI
28d60 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d  nMul+nIn);.    }
28d70 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
28d80 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69  = saved_nOut;.#i
28d90 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
28da0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
28db0 34 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  4.    pBuilder->
28dc0 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63  nRecValid = nRec
28dd0 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20  Valid;.#endif.  
28de0 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  }.  pNew->prereq
28df0 20 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b   = saved_prereq;
28e00 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  .  pNew->u.btree
28e10 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71  .nEq = saved_nEq
28e20 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20  ;.  pNew->nSkip 
28e30 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20  = saved_nSkip;. 
28e40 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
28e50 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
28e60 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
28e70 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65  aved_nOut;.  pNe
28e80 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
28e90 64 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20  d_nLTerm;..  /* 
28ea0 43 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61  Consider using a
28eb0 20 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68   skip-scan if th
28ec0 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
28ed0 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
28ee0 6e 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62  nts.  ** availab
28ef0 6c 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d  le for the left-
28f00 6d 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68  most terms of th
28f10 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20  e index, and if 
28f20 74 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a  the average.  **
28f30 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61   number of repea
28f40 74 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d  ts in the left-m
28f50 6f 73 74 20 74 65 72 6d 73 20 69 73 20 61 74 20  ost terms is at 
28f60 6c 65 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a  least 18. .  **.
28f70 20 20 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 6e    ** The magic n
28f80 75 6d 62 65 72 20 31 38 20 69 73 20 73 65 6c 65  umber 18 is sele
28f90 63 74 65 64 20 6f 6e 20 74 68 65 20 62 61 73 69  cted on the basi
28fa0 73 20 74 68 61 74 20 73 63 61 6e 6e 69 6e 67 20  s that scanning 
28fb0 31 37 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20  17 rows.  ** is 
28fc0 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 71 75  almost always qu
28fd0 69 63 6b 65 72 20 74 68 61 6e 20 61 6e 20 69 6e  icker than an in
28fe0 64 65 78 20 73 65 65 6b 20 28 65 76 65 6e 20 74  dex seek (even t
28ff0 68 6f 75 67 68 20 69 66 20 74 68 65 20 69 6e 64  hough if the ind
29000 65 78 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  ex.  ** contains
29010 20 66 65 77 65 72 20 74 68 61 6e 20 32 5e 31 37   fewer than 2^17
29020 20 72 6f 77 73 20 77 65 20 61 73 73 75 6d 65 20   rows we assume 
29030 6f 74 68 65 72 77 69 73 65 20 69 6e 20 6f 74 68  otherwise in oth
29040 65 72 20 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a  er parts of.  **
29050 20 74 68 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c   the code). And,
29060 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e   even if it is n
29070 6f 74 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f  ot, it should no
29080 74 20 62 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c  t be too much sl
29090 6f 77 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74  ower. .  ** On t
290a0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
290b0 68 65 20 65 78 74 72 61 20 73 65 65 6b 73 20 63  he extra seeks c
290c0 6f 75 6c 64 20 65 6e 64 20 75 70 20 62 65 69 6e  ould end up bein
290d0 67 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a  g significantly.
290e0 20 20 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73    ** more expens
290f0 69 76 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ive.  */.  asser
29100 74 28 20 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 42==sqlite3Lo
29110 67 45 73 74 28 31 38 29 20 29 3b 0a 20 20 69 66  gEst(18) );.  if
29120 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76  ( saved_nEq==sav
29130 65 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73  ed_nSkip.   && s
29140 61 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62  aved_nEq+1<pProb
29150 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26  e->nKeyCol.   &&
29160 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
29170 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31  gEst[saved_nEq+1
29180 5d 3e 3d 34 32 20 20 2f 2a 20 54 55 4e 49 4e 47  ]>=42  /* TUNING
29190 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72 20 73 6b  : Minimum for sk
291a0 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20 20 26 26  ip-scan */.   &&
291b0 20 28 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70   (rc = whereLoop
291c0 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
291d0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
291e0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29  )==SQLITE_OK.  )
291f0 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 49 74  {.    LogEst nIt
29200 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  er;.    pNew->u.
29210 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20  btree.nEq++;.   
29220 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a   pNew->nSkip++;.
29230 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
29240 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d  [pNew->nLTerm++]
29250 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
29260 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
29270 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e  _SKIPSCAN;.    n
29280 49 74 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e 61  Iter = pProbe->a
29290 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
292a0 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e  _nEq] - pProbe->
292b0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
292c0 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 70 4e  d_nEq+1];.    pN
292d0 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 74 65  ew->nOut -= nIte
292e0 72 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  r;.    /* TUNING
292f0 3a 20 20 42 65 63 61 75 73 65 20 75 6e 63 65 72  :  Because uncer
29300 74 61 69 6e 74 69 65 73 20 69 6e 20 74 68 65 20  tainties in the 
29310 65 73 74 69 6d 61 74 65 73 20 66 6f 72 20 73 6b  estimates for sk
29320 69 70 2d 73 63 61 6e 20 71 75 65 72 69 65 73 2c  ip-scan queries,
29330 0a 20 20 20 20 2a 2a 20 61 64 64 20 61 20 31 2e  .    ** add a 1.
29340 33 37 35 20 66 75 64 67 65 20 66 61 63 74 6f 72  375 fudge factor
29350 20 74 6f 20 6d 61 6b 65 20 73 6b 69 70 2d 73 63   to make skip-sc
29360 61 6e 20 73 6c 69 67 68 74 6c 79 20 6c 65 73 73  an slightly less
29370 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20 20 20 20   likely. */.    
29380 6e 49 74 65 72 20 2b 3d 20 35 3b 0a 20 20 20 20  nIter += 5;.    
29390 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
293a0 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c  eIndex(pBuilder,
293b0 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e   pSrc, pProbe, n
293c0 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c 29 3b 0a  Iter + nInMul);.
293d0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
293e0 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
293f0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
29400 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
29410 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20      pNew->nSkip 
29420 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20  = saved_nSkip;. 
29430 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
29440 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73   = saved_wsFlags
29450 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
29460 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
29470 75 72 6e 20 54 72 75 65 20 69 66 20 69 74 20 69  urn True if it i
29480 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
29490 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20  pIndex might be 
294a0 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70  useful in.** imp
294b0 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52  lementing the OR
294c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e  DER BY clause in
294d0 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a   pBuilder..**.**
294e0 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66   Return False if
294f0 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e   pBuilder does n
29500 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52  ot contain an OR
29510 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
29520 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
29530 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65  no way for pInde
29540 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69  x to be useful i
29550 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  n implementing t
29560 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  hat.** ORDER BY 
29570 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  clause..*/.stati
29580 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74  c int indexMight
29590 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28  HelpWithOrderBy(
295a0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
295b0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
295c0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a   Index *pIndex,.
295d0 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b    int iCursor.){
295e0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42  .  ExprList *pOB
295f0 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a  ;.  int ii, jj;.
29600 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62  .  if( pIndex->b
29610 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74 75  Unordered ) retu
29620 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42  rn 0;.  if( (pOB
29630 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
29640 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d  nfo->pOrderBy)==
29650 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
29660 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42  for(ii=0; ii<pOB
29670 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
29680 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
29690 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
296a0 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b  pCollate(pOB->a[
296b0 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  ii].pExpr);.    
296c0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
296d0 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
296e0 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 45 78  n 0;.    if( pEx
296f0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72  pr->iTable==iCur
29700 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 69 66 28  sor ){.      if(
29710 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
29720 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
29730 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a      for(jj=0; jj
29740 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  <pIndex->nKeyCol
29750 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; jj++){.       
29760 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
29770 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43  umn==pIndex->aiC
29780 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75  olumn[jj] ) retu
29790 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
297a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
297b0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
297c0 75 72 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68  urn a bitmask wh
297d0 65 72 65 20 31 73 20 69 6e 64 69 63 61 74 65 20  ere 1s indicate 
297e0 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 73 70  that the corresp
297f0 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66  onding column of
29800 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73  .** the table is
29810 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65   used by an inde
29820 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72  x.  Only the fir
29830 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72  st 63 columns ar
29840 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f  e considered..*/
29850 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
29860 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49  columnsInIndex(I
29870 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42  ndex *pIdx){.  B
29880 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20  itmask m = 0;.  
29890 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70  int j;.  for(j=p
298a0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20  Idx->nColumn-1; 
298b0 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20  j>=0; j--){.    
298c0 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  int x = pIdx->ai
298d0 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69  Column[j];.    i
298e0 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( x>=0 ){.     
298f0 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d   testcase( x==BM
29900 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
29910 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20  tcase( x==BMS-2 
29920 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42  );.      if( x<B
29930 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b  MS-1 ) m |= MASK
29940 42 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20  BIT(x);.    }.  
29950 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a  }.  return m;.}.
29960 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ./* Check to see
29970 20 69 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e   if a partial in
29980 64 65 78 20 77 69 74 68 20 70 50 61 72 74 49 6e  dex with pPartIn
29990 64 65 78 57 68 65 72 65 20 63 61 6e 20 62 65 20  dexWhere can be 
299a0 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63  used.** in the c
299b0 75 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52  urrent query.  R
299c0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
299d0 20 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73   can be and fals
299e0 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  e if not..*/.sta
299f0 74 69 63 20 69 6e 74 20 77 68 65 72 65 55 73 61  tic int whereUsa
29a00 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
29a10 69 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65 43  int iTab, WhereC
29a20 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
29a30 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74   *pWhere){.  int
29a40 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
29a50 2a 70 54 65 72 6d 3b 0a 20 20 66 6f 72 28 69 3d  *pTerm;.  for(i=
29a60 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
29a70 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
29a80 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
29a90 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
29aa0 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 54 65  rImpliesExpr(pTe
29ab0 72 6d 2d 3e 70 45 78 70 72 2c 20 70 57 68 65 72  rm->pExpr, pWher
29ac0 65 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  e, iTab) ) retur
29ad0 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
29ae0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 0;.}../*.** Ad
29af0 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
29b00 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69  objects for a si
29b10 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68  ngle table of th
29b20 65 20 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65  e join where the
29b30 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65   table.** is ide
29b40 6e 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65  nfied by pBuilde
29b50 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20  r->pNew->iTab.  
29b60 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75  That table is gu
29b70 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a  aranteed to be.*
29b80 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65  * a b-tree table
29b90 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  , not a virtual 
29ba0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
29bb0 20 63 6f 73 74 73 20 28 57 68 65 72 65 4c 6f 6f   costs (WhereLoo
29bc0 70 2e 72 52 75 6e 29 20 6f 66 20 74 68 65 20 62  p.rRun) of the b
29bd0 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61 64 64 65  -tree loops adde
29be0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
29bf0 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c  on.** are calcul
29c00 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ated as follows:
29c10 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c  .**.** For a ful
29c20 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67  l scan, assuming
29c30 20 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20 69   the table (or i
29c40 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e  ndex) contains n
29c50 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20  Row rows:.**.** 
29c60 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20      cost = nRow 
29c70 2a 20 33 2e 30 20 20 20 20 20 20 20 20 20 20 20  * 3.0           
29c80 20 20 20 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c           // full
29c90 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20  -table scan.**  
29ca0 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
29cb0 20 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   K              
29cc0 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20          // scan 
29cd0 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  of covering inde
29ce0 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  x.**     cost = 
29cf0 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20  nRow * (K+3.0)  
29d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
29d10 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76   scan of non-cov
29d20 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a  ering index.**.*
29d30 2a 20 77 68 65 72 65 20 4b 20 69 73 20 61 20 76  * where K is a v
29d40 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 31  alue between 1.1
29d50 20 61 6e 64 20 33 2e 30 20 73 65 74 20 62 61 73   and 3.0 set bas
29d60 65 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69  ed on the relati
29d70 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64  ve .** estimated
29d80 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66   average size of
29d90 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
29da0 61 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a  able records..**
29db0 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78  .** For an index
29dc0 20 73 63 61 6e 2c 20 77 68 65 72 65 20 6e 56 69   scan, where nVi
29dd0 73 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  sit is the numbe
29de0 72 20 6f 66 20 69 6e 64 65 78 20 72 6f 77 73 20  r of index rows 
29df0 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 74 68  visited.** by th
29e00 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65  e scan, and nSee
29e10 6b 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  k is the number 
29e20 6f 66 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f  of seek operatio
29e30 6e 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20 0a  ns required on .
29e40 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74  ** the index b-t
29e50 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63  ree:.**.**     c
29e60 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c  ost = nSeek * (l
29e70 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e  og(nRow) + K * n
29e80 56 69 73 69 74 29 20 20 20 20 20 20 20 20 20 20  Visit)          
29e90 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  // covering inde
29ea0 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  x.**     cost = 
29eb0 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f  nSeek * (log(nRo
29ec0 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e  w) + (K+3.0) * n
29ed0 56 69 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e  Visit)    // non
29ee0 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a  -covering index.
29ef0 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
29f00 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e 53 65 65  nSeek is 1. nSee
29f10 6b 20 76 61 6c 75 65 73 20 67 72 65 61 74 65 72  k values greater
29f20 20 74 68 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f   than 1 come abo
29f30 75 74 20 69 66 20 74 68 65 20 0a 2a 2a 20 57 48  ut if the .** WH
29f40 45 52 45 20 63 6c 61 75 73 65 20 69 6e 63 6c 75  ERE clause inclu
29f50 64 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29  des "x IN (....)
29f60 22 20 74 65 72 6d 73 20 75 73 65 64 20 69 6e 20  " terms used in 
29f70 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20  place of "x=?". 
29f80 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c  Or when .** impl
29f90 69 63 69 74 20 22 78 20 49 4e 20 28 53 45 4c 45  icit "x IN (SELE
29fa0 43 54 20 78 20 46 52 4f 4d 20 74 62 6c 29 22 20  CT x FROM tbl)" 
29fb0 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20  terms are added 
29fc0 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a  for skip-scans..
29fd0 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
29fe0 74 65 64 20 76 61 6c 75 65 73 20 28 6e 52 6f 77  ted values (nRow
29ff0 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b 29  , nVisit, nSeek)
2a000 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61   often contain a
2a010 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a   large amount.**
2a020 20 6f 66 20 75 6e 63 65 72 74 61 69 6e 74 79 2e   of uncertainty.
2a030 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f    For this reaso
2a040 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73 20 64 65  n, scoring is de
2a050 73 69 67 6e 65 64 20 74 6f 20 70 69 63 6b 20 70  signed to pick p
2a060 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f  lans that.** "do
2a070 20 74 68 65 20 6c 65 61 73 74 20 68 61 72 6d 22   the least harm"
2a080 20 69 66 20 74 68 65 20 65 73 74 69 6d 61 74 65   if the estimate
2a090 73 20 61 72 65 20 69 6e 61 63 63 75 72 61 74 65  s are inaccurate
2a0a0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
2a0b0 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66  a.** log(nRow) f
2a0c0 61 63 74 6f 72 20 69 73 20 6f 6d 69 74 74 65 64  actor is omitted
2a0d0 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65   from a non-cove
2a0e0 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20  ring index scan 
2a0f0 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62  in order to.** b
2a100 69 61 73 20 74 68 65 20 73 63 6f 72 69 6e 67 20  ias the scoring 
2a110 69 6e 20 66 61 76 6f 72 20 6f 66 20 75 73 69 6e  in favor of usin
2a120 67 20 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63  g an index, sinc
2a130 65 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65  e the worst-case
2a140 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  .** performance 
2a150 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  of using an inde
2a160 78 20 69 73 20 66 61 72 20 62 65 74 74 65 72 20  x is far better 
2a170 74 68 61 6e 20 74 68 65 20 77 6f 72 73 74 2d 63  than the worst-c
2a180 61 73 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ase performance.
2a190 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62  ** of a full tab
2a1a0 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74  le scan..*/.stat
2a1b0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
2a1c0 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65 72  AddBtree(.  Wher
2a1d0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
2a1e0 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45  uilder, /* WHERE
2a1f0 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
2a200 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
2a210 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20 20   mExtra         
2a220 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72       /* Extra pr
2a230 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72 20  erequesites for 
2a240 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65  using this table
2a250 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
2a260 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
2a270 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e       /* WHERE an
2a280 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a  alysis context *
2a290 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
2a2a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2a2b0 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61  /* An index we a
2a2c0 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f  re evaluating */
2a2d0 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20  .  Index sPk;   
2a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a2f0 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f  * A fake index o
2a300 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72  bject for the pr
2a310 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c  imary key */.  L
2a320 6f 67 45 73 74 20 61 69 52 6f 77 45 73 74 50 6b  ogEst aiRowEstPk
2a330 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  [2];       /* Th
2a340 65 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20  e aiRowLogEst[] 
2a350 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50  value for the sP
2a360 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36  k index */.  i16
2a370 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31   aiColumnPk = -1
2a380 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
2a390 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20  aColumn[] value 
2a3a0 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65  for the sPk inde
2a3b0 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  x */.  SrcList *
2a3c0 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20  pTabList;       
2a3d0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
2a3e0 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
2a3f0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2a400 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52  pSrc;  /* The FR
2a410 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65 20  OM clause btree 
2a420 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20  term to add */. 
2a430 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
2a440 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2a450 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f  Template WhereLo
2a460 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
2a470 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2a480 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  K;         /* Re
2a490 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2a4a0 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b  nt iSortIdx = 1;
2a4b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2a4c0 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
2a4d0 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20 20  int b;          
2a4e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2a4f0 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a   boolean value *
2a500 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65  /.  LogEst rSize
2a510 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a520 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* number of row
2a530 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
2a540 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53  /.  LogEst rLogS
2a550 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2a560 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20  /* Logarithm of 
2a570 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
2a580 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
2a590 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
2a5a0 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
2a5b0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 57   /* The parsed W
2a5c0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2a5d0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
2a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a5f0 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72  Table being quer
2a600 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77  ied */.  .  pNew
2a610 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
2a620 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42  w;.  pWInfo = pB
2a630 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
2a640 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49    pTabList = pWI
2a650 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
2a660 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74   pSrc = pTabList
2a670 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62  ->a + pNew->iTab
2a680 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
2a690 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70  >pTab;.  pWC = p
2a6a0 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
2a6b0 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75  assert( !IsVirtu
2a6c0 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29  al(pSrc->pTab) )
2a6d0 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70  ;..  if( pSrc->p
2a6e0 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20  Index ){.    /* 
2a6f0 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  An INDEXED BY cl
2a700 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61  ause specifies a
2a710 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
2a720 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20  x to use */.    
2a730 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70  pProbe = pSrc->p
2a740 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69  Index;.  }else i
2a750 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
2a760 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65  b) ){.    pProbe
2a770 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
2a780 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2a790 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44   There is no IND
2a7a0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20  EXED BY clause. 
2a7b0 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20 49   Create a fake I
2a7c0 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c  ndex object in l
2a7d0 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69  ocal.    ** vari
2a7e0 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72  able sPk to repr
2a7f0 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20  esent the rowid 
2a800 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
2a810 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20  x.  Make this.  
2a820 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20    ** fake index 
2a830 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 63  the first in a c
2a840 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62  hain of Index ob
2a850 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f  jects with all o
2a860 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a  f the real.    *
2a870 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c  * indices to fol
2a880 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  low */.    Index
2a890 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
2a8a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2a8b0 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69  rst of real indi
2a8c0 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
2a8d0 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
2a8e0 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49  sPk, 0, sizeof(I
2a8f0 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e  ndex));.    sPk.
2a900 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20  nKeyCol = 1;.   
2a910 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31   sPk.nColumn = 1
2a920 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75  ;.    sPk.aiColu
2a930 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b  mn = &aiColumnPk
2a940 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c  ;.    sPk.aiRowL
2a950 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74  ogEst = aiRowEst
2a960 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72  Pk;.    sPk.onEr
2a970 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65  ror = OE_Replace
2a980 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65  ;.    sPk.pTable
2a990 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b   = pTab;.    sPk
2a9a0 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62  .szIdxRow = pTab
2a9b0 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20  ->szTabRow;.    
2a9c0 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20  aiRowEstPk[0] = 
2a9d0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
2a9e0 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
2a9f0 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  [1] = 0;.    pFi
2aa00 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  rst = pSrc->pTab
2aa10 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  ->pIndex;.    if
2aa20 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78  ( pSrc->notIndex
2aa30 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ed==0 ){.      /
2aa40 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63  * The real indic
2aa50 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  es of the table 
2aa60 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65  are only conside
2aa70 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20  red if the.     
2aa80 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   ** NOT INDEXED 
2aa90 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69  qualifier is omi
2aaa0 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52  tted from the FR
2aab0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
2aac0 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70     sPk.pNext = p
2aad0 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20  First;.    }.   
2aae0 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a   pProbe = &sPk;.
2aaf0 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70 54    }.  rSize = pT
2ab00 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a  ab->nRowLogEst;.
2ab10 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
2ab20 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66  Log(rSize);..#if
2ab30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2ab40 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
2ab50 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20  .  /* Automatic 
2ab60 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28  indexes */.  if(
2ab70 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53   !pBuilder->pOrS
2ab80 65 74 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  et.   && (pWInfo
2ab90 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ->pParse->db->fl
2aba0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74  ags & SQLITE_Aut
2abb0 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26 26  oIndex)!=0.   &&
2abc0 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30   pSrc->pIndex==0
2abd0 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 76 69  .   && !pSrc->vi
2abe0 61 43 6f 72 6f 75 74 69 6e 65 0a 20 20 20 26 26  aCoroutine.   &&
2abf0 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78   !pSrc->notIndex
2ac00 65 64 0a 20 20 20 26 26 20 48 61 73 52 6f 77 69  ed.   && HasRowi
2ac10 64 28 70 54 61 62 29 0a 20 20 20 26 26 20 21 70  d(pTab).   && !p
2ac20 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65  Src->isCorrelate
2ac30 64 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 69  d.   && !pSrc->i
2ac40 73 52 65 63 75 72 73 69 76 65 0a 20 20 29 7b 0a  sRecursive.  ){.
2ac50 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
2ac60 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65  auto-index Where
2ac70 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65  Loops */.    Whe
2ac80 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
2ac90 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57     WhereTerm *pW
2aca0 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20  CEnd = pWC->a + 
2acb0 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20  pWC->nTerm;.    
2acc0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
2acd0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
2ace0 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  && pTerm<pWCEnd;
2acf0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
2ad00 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
2ad10 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e  eqRight & pNew->
2ad20 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69  maskSelf ) conti
2ad30 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74  nue;.      if( t
2ad40 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
2ad50 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29  (pTerm, pSrc, 0)
2ad60 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
2ad70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
2ad80 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
2ad90 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  >nSkip = 0;.    
2ada0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
2adb0 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
2adc0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
2add0 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
2ade0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  pNew->aLTerm[0] 
2adf0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
2ae00 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d   /* TUNING: One-
2ae10 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f  time cost for co
2ae20 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f  mputing the auto
2ae30 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20  matic index is. 
2ae40 20 20 20 20 20 20 20 2a 2a 20 65 73 74 69 6d 61         ** estima
2ae50 74 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f  ted to be X*N*lo
2ae60 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73  g2(N) where N is
2ae70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2ae80 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a  ows in.        *
2ae90 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * the table bein
2aea0 67 20 69 6e 64 65 78 65 64 20 61 6e 64 20 77 68  g indexed and wh
2aeb0 65 72 65 20 58 20 69 73 20 37 20 28 4c 6f 67 45  ere X is 7 (LogE
2aec0 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d 61  st=28) for norma
2aed0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  l.        ** tab
2aee0 6c 65 73 20 6f 72 20 31 2e 33 37 35 20 28 4c 6f  les or 1.375 (Lo
2aef0 67 45 73 74 3d 34 29 20 66 6f 72 20 76 69 65 77  gEst=4) for view
2af00 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
2af10 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 20 20 20  .  The value.   
2af20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20 69 73 20       ** of X is 
2af30 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69 65 77  smaller for view
2af40 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
2af50 20 73 6f 20 74 68 61 74 20 74 68 65 20 71 75 65   so that the que
2af60 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20 20  ry planner.     
2af70 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 6f     ** will be mo
2af80 72 65 20 61 67 67 72 65 73 73 69 76 65 20 61 62  re aggressive ab
2af90 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61  out generating a
2afa0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73  utomatic indexes
2afb0 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   for.        ** 
2afc0 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20 73  those objects, s
2afd0 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f  ince there is no
2afe0 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
2aff0 61 64 64 20 73 63 68 65 6d 61 0a 20 20 20 20 20  add schema.     
2b000 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f 6e     ** indexes on
2b010 20 73 75 62 71 75 65 72 69 65 73 20 61 6e 64 20   subqueries and 
2b020 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  views. */.      
2b030 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
2b040 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a   rLogSize + rSiz
2b050 65 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 69  e + 4;.        i
2b060 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
2b070 3d 3d 30 20 26 26 20 28 70 54 61 62 2d 3e 74 61  ==0 && (pTab->ta
2b080 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
2b090 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  meral)==0 ){.   
2b0a0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65         pNew->rSe
2b0b0 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20 20 20 20  tup += 24;.     
2b0c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70     }.        App
2b0d0 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
2b0e0 28 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20 70  (pNew->rSetup, p
2b0f0 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
2b100 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
2b110 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f  G: Each index lo
2b120 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20 72  okup yields 20 r
2b130 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
2b140 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20 20 20  .  This.        
2b150 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  ** is more than 
2b160 74 68 65 20 75 73 75 61 6c 20 67 75 65 73 73 20  the usual guess 
2b170 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e 63  of 10 rows, sinc
2b180 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61 79  e we have no way
2b190 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b  .        ** of k
2b1a0 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c 65 63  nowing how selec
2b1b0 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 77  tive the index w
2b1c0 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
2b1d0 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20  e.  It would.   
2b1e0 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75       ** not be u
2b1f0 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d  nreasonable to m
2b200 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d  ake this value m
2b210 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20  uch larger. */. 
2b220 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
2b230 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28  t = 43;  assert(
2b240 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   43==sqlite3LogE
2b250 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20  st(20) );.      
2b260 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
2b270 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
2b280 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e  rLogSize,pNew->n
2b290 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  Out);.        pN
2b2a0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
2b2b0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a  ERE_AUTO_INDEX;.
2b2c0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
2b2d0 65 72 65 71 20 3d 20 6d 45 78 74 72 61 20 7c 20  ereq = mExtra | 
2b2e0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
2b2f0 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
2b300 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
2b310 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
2b320 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2b330 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
2b340 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
2b350 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20  TIC_INDEX */..  
2b360 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  /* Loop over all
2b370 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20   indices.  */.  
2b380 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45  for(; rc==SQLITE
2b390 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70  _OK && pProbe; p
2b3a0 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e  Probe=pProbe->pN
2b3b0 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29  ext, iSortIdx++)
2b3c0 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65  {.    if( pProbe
2b3d0 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
2b3e0 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68 65 72  =0.     && !wher
2b3f0 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e  eUsablePartialIn
2b400 64 65 78 28 70 53 72 63 2d 3e 69 43 75 72 73 6f  dex(pSrc->iCurso
2b410 72 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e  r, pWC, pProbe->
2b420 70 50 61 72 74 49 64 78 57 68 65 72 65 29 20 29  pPartIdxWhere) )
2b430 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
2b440 28 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70 53  ( pNew->iTab!=pS
2b450 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20 20  rc->iCursor );  
2b460 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20 5b 39  /* See ticket [9
2b470 38 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20 20  8d973b8f5] */.  
2b480 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
2b490 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20  * Partial index 
2b4a0 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  inappropriate fo
2b4b0 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  r this query */.
2b4c0 20 20 20 20 7d 0a 20 20 20 20 72 53 69 7a 65 20      }.    rSize 
2b4d0 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
2b4e0 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70 4e  ogEst[0];.    pN
2b4f0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
2b500 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  = 0;.    pNew->n
2b510 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e  Skip = 0;.    pN
2b520 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
2b530 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
2b540 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  dx = 0;.    pNew
2b550 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
2b560 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
2b570 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e 65   mExtra;.    pNe
2b580 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
2b590 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
2b5a0 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f  ee.pIndex = pPro
2b5b0 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65  be;.    b = inde
2b5c0 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
2b5d0 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20  derBy(pBuilder, 
2b5e0 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43  pProbe, pSrc->iC
2b5f0 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54  ursor);.    /* T
2b600 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  he ONEPASS_DESIR
2b610 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f  ED flags never o
2b620 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77  ccurs together w
2b630 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  ith ORDER BY */.
2b640 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49      assert( (pWI
2b650 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2b660 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2b670 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62  DESIRED)==0 || b
2b680 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
2b690 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29  Probe->tnum<=0 )
2b6a0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67  {.      /* Integ
2b6b0 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  er primary key i
2b6c0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e  ndex */.      pN
2b6d0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
2b6e0 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20  ERE_IPK;..      
2b6f0 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63  /* Full table sc
2b700 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  an */.      pNew
2b710 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
2b720 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20   iSortIdx : 0;. 
2b730 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
2b740 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62  Cost of full tab
2b750 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e  le scan is (N*3.
2b760 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  0). */.      pNe
2b770 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20  w->rRun = rSize 
2b780 2b 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70 6c  + 16;.      Appl
2b790 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
2b7a0 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62  pNew->rRun, pTab
2b7b0 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
2b7c0 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
2b7d0 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e  utAdjust(pWC, pN
2b7e0 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
2b7f0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2b800 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
2b810 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e   pNew);.      pN
2b820 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
2b830 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2b840 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
2b850 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  e{.      Bitmask
2b860 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   m;.      if( pP
2b870 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67  robe->isCovering
2b880 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
2b890 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
2b8a0 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45  E_IDX_ONLY | WHE
2b8b0 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
2b8c0 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20      m = 0;.     
2b8d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b8e0 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  m = pSrc->colUse
2b8f0 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e  d & ~columnsInIn
2b900 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20  dex(pProbe);.   
2b910 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
2b920 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57  gs = (m==0) ? (W
2b930 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48  HERE_IDX_ONLY|WH
2b940 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57  ERE_INDEXED) : W
2b950 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20  HERE_INDEXED;.  
2b960 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2b970 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e  Full scan via in
2b980 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
2b990 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61   b.       || !Ha
2b9a0 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20  sRowid(pTab).   
2b9b0 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20      || ( m==0.  
2b9c0 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65         && pProbe
2b9d0 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a  ->bUnordered==0.
2b9e0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 72           && (pPr
2b9f0 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54  obe->szIdxRow<pT
2ba00 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20  ab->szTabRow).  
2ba10 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
2ba20 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
2ba30 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
2ba40 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  SIRED)==0.      
2ba50 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f     && sqlite3Glo
2ba60 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
2ba70 73 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70  s.         && Op
2ba80 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
2ba90 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  d(pWInfo->pParse
2baa0 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76  ->db, SQLITE_Cov
2bab0 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20  erIdxScan).     
2bac0 20 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a       ).      ){.
2bad0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53          pNew->iS
2bae0 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f  ortIdx = b ? iSo
2baf0 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20  rtIdx : 0;..    
2bb00 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
2bb10 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68 65 20  of visiting the 
2bb20 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e 2a  index rows is N*
2bb30 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20 20  K, where K is.  
2bb40 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e        ** between
2bb50 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64 65   1.1 and 3.0, de
2bb60 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 72  pending on the r
2bb70 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66  elative sizes of
2bb80 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
2bb90 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20  index and table 
2bba0 72 6f 77 73 2e 20 49 66 20 74 68 69 73 20 69 73  rows. If this is
2bbb0 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20   a non-covering 
2bbc0 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20 20 20 20  index scan,.    
2bbd0 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61 64 64 20      ** also add 
2bbe0 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  the cost of visi
2bbf0 74 69 6e 67 20 74 61 62 6c 65 20 72 6f 77 73 20  ting table rows 
2bc00 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20 20 20  (N*3.0).  */.   
2bc10 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2bc20 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31  = rSize + 1 + (1
2bc30 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52  5*pProbe->szIdxR
2bc40 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52  ow)/pTab->szTabR
2bc50 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ow;.        if( 
2bc60 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m!=0 ){.        
2bc70 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
2bc80 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
2bc90 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 53 69 7a  pNew->rRun, rSiz
2bca0 65 2b 31 36 29 3b 0a 20 20 20 20 20 20 20 20 7d  e+16);.        }
2bcb0 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f  .        ApplyCo
2bcc0 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
2bcd0 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63  w->rRun, pTab->c
2bce0 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20  ostMult);.      
2bcf0 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
2bd00 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65  tAdjust(pWC, pNe
2bd10 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20  w, rSize);.     
2bd20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2bd30 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
2bd40 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
2bd50 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
2bd60 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
2bd70 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
2bd80 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2bd90 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2bda0 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
2bdb0 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
2bdc0 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53  be, 0);.#ifdef S
2bdd0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
2bde0 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
2bdf0 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
2be00 65 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d 3e  eFree(pBuilder->
2be10 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69 6c  pRec);.    pBuil
2be20 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
2be30 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72   0;.    pBuilder
2be40 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64  ->pRec = 0;.#end
2be50 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
2be60 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58  ere was an INDEX
2be70 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
2be80 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65  en only that one
2be90 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a   index is.    **
2bea0 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a   considered. */.
2beb0 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49      if( pSrc->pI
2bec0 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 20 20  ndex ) break;.  
2bed0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2bee0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2bef0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2bf00 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  LE./*.** Add all
2bf10 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
2bf20 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f  ts for a table o
2bf30 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74  f the join ident
2bf40 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69  ified by.** pBui
2bf50 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
2bf60 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
2bf70 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
2bf80 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  e a virtual tabl
2bf90 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2bfa0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
2bfb0 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tual(.  WhereLoo
2bfc0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
2bfd0 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c  er,  /* WHERE cl
2bfe0 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
2bff0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45   */.  Bitmask mE
2c000 78 74 72 61 0a 29 7b 0a 20 20 57 68 65 72 65 49  xtra.){.  WhereI
2c010 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
2c020 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
2c030 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74  analysis context
2c040 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
2c050 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
2c060 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
2c070 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
2c080 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
2c090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2c0a0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2c0b0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
2c0c0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20  ist_item *pSrc; 
2c0d0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
2c0e0 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61  ause term to sea
2c0f0 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  rch */.  Table *
2c100 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
2c110 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  *db;.  sqlite3_i
2c120 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
2c130 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71  nfo;.  struct sq
2c140 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
2c150 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
2c160 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
2c170 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
2c180 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
2c190 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  e;.  WhereTerm *
2c1a0 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20  pTerm;.  int i, 
2c1b0 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20  j;.  int iTerm, 
2c1c0 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43  mxTerm;.  int nC
2c1d0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74  onstraint;.  int
2c1e0 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20   seenIn = 0;    
2c1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2c200 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72 61  e if an IN opera
2c210 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  tor is seen */. 
2c220 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20 30   int seenVar = 0
2c230 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2c240 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63   True if a non-c
2c250 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61 69  onstant constrai
2c260 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20  nt is seen */.  
2c270 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20 20  int iPhase;     
2c280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c290 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c  0: const w/o IN,
2c2a0 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f   1: const, 2: no
2c2b0 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20   IN,  2: IN */. 
2c2c0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
2c2d0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2c2e0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66  ITE_OK;..  pWInf
2c2f0 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
2c300 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d  Info;.  pParse =
2c310 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
2c320 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
2c330 64 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  db;.  pWC = pBui
2c340 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65  lder->pWC;.  pNe
2c350 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
2c360 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57  ew;.  pSrc = &pW
2c370 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
2c380 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20  a[pNew->iTab];. 
2c390 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54   pTab = pSrc->pT
2c3a0 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73  ab;.  assert( Is
2c3b0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 3b  Virtual(pTab) );
2c3c0 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c  .  pIdxInfo = al
2c3d0 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
2c3e0 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72  pParse, pWC, pSr
2c3f0 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  c, pBuilder->pOr
2c400 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70 49  derBy);.  if( pI
2c410 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75  dxInfo==0 ) retu
2c420 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2c430 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  .  pNew->prereq 
2c440 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65  = 0;.  pNew->rSe
2c450 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  tup = 0;.  pNew-
2c460 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
2c470 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20  _VIRTUALTABLE;. 
2c480 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
2c490 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  0;.  pNew->u.vta
2c4a0 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
2c4b0 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49    pUsage = pIdxI
2c4c0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
2c4d0 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72  Usage;.  nConstr
2c4e0 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d  aint = pIdxInfo-
2c4f0 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >nConstraint;.  
2c500 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
2c510 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43  ize(db, pNew, nC
2c520 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20  onstraint) ){.  
2c530 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2c540 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  db, pIdxInfo);. 
2c550 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c560 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66  _NOMEM;.  }..  f
2c570 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50 68  or(iPhase=0; iPh
2c580 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b  ase<=3; iPhase++
2c590 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e  ){.    if( !seen
2c5a0 49 6e 20 26 26 20 28 69 50 68 61 73 65 26 31 29  In && (iPhase&1)
2c5b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 68  !=0 ){.      iPh
2c5c0 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ase++;.      if(
2c5d0 20 69 50 68 61 73 65 3e 33 20 29 20 62 72 65 61   iPhase>3 ) brea
2c5e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
2c5f0 20 21 73 65 65 6e 56 61 72 20 26 26 20 69 50 68   !seenVar && iPh
2c600 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20  ase>1 ) break;. 
2c610 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28     pIdxCons = *(
2c620 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
2c630 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
2c640 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
2c650 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f  nstraint;.    fo
2c660 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66  r(i=0; i<pIdxInf
2c670 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  o->nConstraint; 
2c680 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
2c690 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78  {.      j = pIdx
2c6a0 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65  Cons->iTermOffse
2c6b0 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  t;.      pTerm =
2c6c0 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20   &pWC->a[j];.   
2c6d0 20 20 20 73 77 69 74 63 68 28 20 69 50 68 61 73     switch( iPhas
2c6e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
2c6f0 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74  e 0:    /* Const
2c700 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e 20  ants without IN 
2c710 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
2c720 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
2c730 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  usable = 0;.    
2c740 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
2c750 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2c760 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  _IN)!=0 ){.     
2c770 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d 20         seenIn = 
2c780 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
2c790 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65           if( pTe
2c7a0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 21  rm->prereqRight!
2c7b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2c7c0 20 20 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20    seenVar = 1;. 
2c7d0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
2c7e0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
2c7f0 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30  ator & WO_IN)==0
2c800 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c810 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
2c820 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2c830 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
2c840 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
2c850 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e  1:    /* Constan
2c860 74 73 20 77 69 74 68 20 49 4e 20 6f 70 65 72 61  ts with IN opera
2c870 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  tors */.        
2c880 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 49 6e    assert( seenIn
2c890 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49   );.          pI
2c8a0 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
2c8b0 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
2c8c0 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20 20 20 20  ight==0);.      
2c8d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2c8e0 20 20 20 63 61 73 65 20 32 3a 20 20 20 20 2f 2a     case 2:    /*
2c8f0 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 6f   Variables witho
2c900 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20  ut IN */.       
2c910 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56     assert( seenV
2c920 61 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ar );.          
2c930 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
2c940 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72   = (pTerm->eOper
2c950 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30  ator & WO_IN)==0
2c960 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2c970 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75  k;.        defau
2c980 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69 61 62 6c  lt:   /* Variabl
2c990 65 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20  es with IN */.  
2c9a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c9b0 73 65 65 6e 56 61 72 20 26 26 20 73 65 65 6e 49  seenVar && seenI
2c9c0 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  n );.          p
2c9d0 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
2c9e0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
2c9f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2ca00 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
2ca10 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Usage, 0, sizeof
2ca20 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78  (pUsage[0])*pIdx
2ca30 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
2ca40 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  t);.    if( pIdx
2ca50 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
2ca60 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33  IdxStr ) sqlite3
2ca70 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
2ca80 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70 49 64  idxStr);.    pId
2ca90 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20  xInfo->idxStr = 
2caa0 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
2cab0 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20  >idxNum = 0;.   
2cac0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
2cad0 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
2cae0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f  .    pIdxInfo->o
2caf0 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
2cb00 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
2cb10 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
2cb20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  = SQLITE_BIG_DBL
2cb30 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20   / (double)2;.  
2cb40 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
2cb50 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a  matedRows = 25;.
2cb60 20 20 20 20 72 63 20 3d 20 76 74 61 62 42 65 73      rc = vtabBes
2cb70 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  tIndex(pParse, p
2cb80 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  Tab, pIdxInfo);.
2cb90 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2cba0 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  o whereLoopAddVt
2cbb0 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49 64  ab_exit;.    pId
2cbc0 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
2cbd0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
2cbe0 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
2cbf0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
2cc00 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72  nt;.    pNew->pr
2cc10 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20  ereq = mExtra;. 
2cc20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a     mxTerm = -1;.
2cc30 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
2cc40 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74  ->nLSlot>=nConst
2cc50 72 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72  raint );.    for
2cc60 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
2cc70 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e  int; i++) pNew->
2cc80 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20  aLTerm[i] = 0;. 
2cc90 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2cca0 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  omitMask = 0;.  
2ccb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
2ccc0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
2ccd0 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
2cce0 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70    if( (iTerm = p
2ccf0 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
2cd00 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20  ex - 1)>=0 ){.  
2cd10 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f        j = pIdxCo
2cd20 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b  ns->iTermOffset;
2cd30 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
2cd40 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a  rm>=nConstraint.
2cd50 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a           || j<0.
2cd60 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70           || j>=p
2cd70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20  WC->nTerm.      
2cd80 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65     || pNew->aLTe
2cd90 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20  rm[iTerm]!=0.   
2cda0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2cdb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
2cdc0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ROR;.          s
2cdd0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2cde0 50 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74  Parse, "%s.xBest
2cdf0 49 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74  Index() malfunct
2ce00 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ion", pTab->zNam
2ce10 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
2ce20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  to whereLoopAddV
2ce30 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  tab_exit;.      
2ce40 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
2ce50 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f  case( iTerm==nCo
2ce60 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20  nstraint-1 );.  
2ce70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ce80 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  j==0 );.        
2ce90 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43  testcase( j==pWC
2cea0 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20  ->nTerm-1 );.   
2ceb0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
2cec0 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  C->a[j];.       
2ced0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d   pNew->prereq |=
2cee0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
2cef0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ght;.        ass
2cf00 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d  ert( iTerm<pNew-
2cf10 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
2cf20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
2cf30 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a  iTerm] = pTerm;.
2cf40 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
2cf50 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72  m>mxTerm ) mxTer
2cf60 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  m = iTerm;.     
2cf70 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
2cf80 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20  rm==15 );.      
2cf90 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
2cfa0 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 20  m==16 );.       
2cfb0 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26   if( iTerm<16 &&
2cfc0 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20   pUsage[i].omit 
2cfd0 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f  ) pNew->u.vtab.o
2cfe0 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54  mitMask |= 1<<iT
2cff0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
2d000 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2d010 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29  or & WO_IN)!=0 )
2d020 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2d030 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d  pUsage[i].omit==
2d040 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2d050 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   /* Do not attem
2d060 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20  pt to use an IN 
2d070 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68  constraint if th
2d080 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a  e virtual table.
2d090 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
2d0a0 61 79 73 20 74 68 61 74 20 74 68 65 20 65 71 75  ays that the equ
2d0b0 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74  ivalent EQ const
2d0c0 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
2d0d0 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a  safely omitted..
2d0e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49              ** I
2d0f0 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20  f we do attempt 
2d100 74 6f 20 75 73 65 20 73 75 63 68 20 61 20 63 6f  to use such a co
2d110 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72  nstraint, some r
2d120 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20  ows might be.   
2d130 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65           ** repe
2d140 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70  ated in the outp
2d150 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ut. */.         
2d160 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2d170 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2d180 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62  /* A virtual tab
2d190 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  le that is const
2d1a0 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20  rained by an IN 
2d1b0 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20  clause may not. 
2d1c0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
2d1d0 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ume the ORDER BY
2d1e0 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20   clause because 
2d1f0 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66  (1) the order of
2d200 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20   IN terms.      
2d210 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65      ** is not ne
2d220 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65  cessarily relate
2d230 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f  d to the order o
2d240 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61  f output terms a
2d250 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
2d260 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74  (2) Multiple out
2d270 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67  puts from a sing
2d280 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c  le IN value will
2d290 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20   not merge.     
2d2a0 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72       ** together
2d2b0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2d2c0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
2d2d0 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
2d2e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2d2f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2d300 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b  >=nConstraint ){
2d310 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  .      pNew->nLT
2d320 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a  erm = mxTerm+1;.
2d330 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
2d340 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77  ew->nLTerm<=pNew
2d350 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20  ->nLSlot );.    
2d360 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
2d370 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f  dxNum = pIdxInfo
2d380 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20  ->idxNum;.      
2d390 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
2d3a0 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f  dFree = pIdxInfo
2d3b0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2d3c0 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e  tr;.      pIdxIn
2d3d0 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
2d3e0 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  xStr = 0;.      
2d3f0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
2d400 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  Str = pIdxInfo->
2d410 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e  idxStr;.      pN
2d420 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64  ew->u.vtab.isOrd
2d430 65 72 65 64 20 3d 20 28 69 38 29 28 70 49 64 78  ered = (i8)(pIdx
2d440 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
2d450 73 75 6d 65 64 20 3f 0a 20 20 20 20 20 20 20 20  sumed ?.        
2d460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2d480 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
2d490 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65   : 0);.      pNe
2d4a0 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
2d4b0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2d4c0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46  = sqlite3LogEstF
2d4d0 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e  romDouble(pIdxIn
2d4e0 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
2d4f0 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  t);.      pNew->
2d500 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nOut = sqlite3Lo
2d510 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65  gEst(pIdxInfo->e
2d520 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 20  stimatedRows);. 
2d530 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e       whereLoopIn
2d540 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
2d550 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20  New);.      if( 
2d560 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
2d570 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  dFree ){.       
2d580 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
2d590 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  ew->u.vtab.idxSt
2d5a0 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  r);.        pNew
2d5b0 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
2d5c0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
2d5d0 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72     }.  }  ..wher
2d5e0 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69  eLoopAddVtab_exi
2d5f0 74 3a 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  t:.  if( pIdxInf
2d600 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2d610 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72  Str ) sqlite3_fr
2d620 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  ee(pIdxInfo->idx
2d630 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
2d640 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e  bFree(db, pIdxIn
2d650 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  fo);.  return rc
2d660 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2d670 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2d680 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
2d690 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65   Add WhereLoop e
2d6a0 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65  ntries to handle
2d6b0 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73   OR terms.  This
2d6c0 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65   works for eithe
2d6d0 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76  r.** btrees or v
2d6e0 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a  irtual tables..*
2d6f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
2d700 72 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68 65 72  reLoopAddOr(Wher
2d710 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
2d720 75 69 6c 64 65 72 2c 20 42 69 74 6d 61 73 6b 20  uilder, Bitmask 
2d730 6d 45 78 74 72 61 29 7b 0a 20 20 57 68 65 72 65  mExtra){.  Where
2d740 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
2d750 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
2d760 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2d770 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
2d780 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54   *pNew;.  WhereT
2d790 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43  erm *pTerm, *pWC
2d7a0 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  End;.  int rc = 
2d7b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
2d7c0 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c   iCur;.  WhereCl
2d7d0 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57  ause tempWC;.  W
2d7e0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2d7f0 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65  sSubBuild;.  Whe
2d800 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43  reOrSet sSum, sC
2d810 75 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  ur;.  struct Src
2d820 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2d830 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75  ;.  .  pWC = pBu
2d840 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57  ilder->pWC;.  pW
2d850 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20  CEnd = pWC->a + 
2d860 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e  pWC->nTerm;.  pN
2d870 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
2d880 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  New;.  memset(&s
2d890 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Sum, 0, sizeof(s
2d8a0 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d  Sum));.  pItem =
2d8b0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2d8c0 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
2d8d0 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65  b;.  iCur = pIte
2d8e0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66  m->iCursor;..  f
2d8f0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
2d900 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26   pTerm<pWCEnd &&
2d910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
2d920 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
2d930 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
2d940 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a  tor & WO_OR)!=0.
2d950 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
2d960 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78  u.pOrInfo->index
2d970 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73  able & pNew->mas
2d980 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29  kSelf)!=0 .    )
2d990 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61  {.      WhereCla
2d9a0 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57  use * const pOrW
2d9b0 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f  C = &pTerm->u.pO
2d9c0 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  rInfo->wc;.     
2d9d0 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e   WhereTerm * con
2d9e0 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70  st pOrWCEnd = &p
2d9f0 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e  OrWC->a[pOrWC->n
2da00 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65  Term];.      Whe
2da10 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
2da20 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20  .      int once 
2da30 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  = 1;.      int i
2da40 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20  , j;.    .      
2da50 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75  sSubBuild = *pBu
2da60 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75  ilder;.      sSu
2da70 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20  bBuild.pOrderBy 
2da80 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42  = 0;.      sSubB
2da90 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26 73  uild.pOrSet = &s
2daa0 43 75 72 3b 0a 0a 20 20 20 20 20 20 57 48 45 52  Cur;..      WHER
2dab0 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22  ETRACE(0x200, ("
2dac0 42 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  Begin processing
2dad0 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22   OR-clause %p\n"
2dae0 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 20  , pTerm));.     
2daf0 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72   for(pOrTerm=pOr
2db00 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70  WC->a; pOrTerm<p
2db10 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d  OrWCEnd; pOrTerm
2db20 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
2db30 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
2db40 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d  ator & WO_AND)!=
2db50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
2db60 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26  SubBuild.pWC = &
2db70 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49  pOrTerm->u.pAndI
2db80 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20  nfo->wc;.       
2db90 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
2dba0 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
2dbb0 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
2dbc0 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20    tempWC.pWInfo 
2dbd0 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20  = pWC->pWInfo;. 
2dbe0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
2dbf0 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20  pOuter = pWC;.  
2dc00 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f          tempWC.o
2dc10 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20  p = TK_AND;.    
2dc20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65        tempWC.nTe
2dc30 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
2dc40 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72    tempWC.a = pOr
2dc50 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
2dc60 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
2dc70 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20  &tempWC;.       
2dc80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2dc90 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2dca0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43      }.        sC
2dcb0 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66  ur.n = 0;.#ifdef
2dcc0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
2dcd0 4c 45 44 0a 20 20 20 20 20 20 20 20 57 48 45 52  LED.        WHER
2dce0 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22  ETRACE(0x200, ("
2dcf0 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66 20 25 70  OR-term %d of %p
2dd00 20 68 61 73 20 25 64 20 73 75 62 74 65 72 6d 73   has %d subterms
2dd10 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  :\n", .         
2dd20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
2dd30 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61  pOrTerm-pOrWC->a
2dd40 29 2c 20 70 54 65 72 6d 2c 20 73 53 75 62 42 75  ), pTerm, sSubBu
2dd50 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29  ild.pWC->nTerm))
2dd60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
2dd70 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
2dd80 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20  & 0x400 ){.     
2dd90 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2dda0 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e  sSubBuild.pWC->n
2ddb0 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
2ddc0 20 20 20 20 20 20 20 20 77 68 65 72 65 54 65 72          whereTer
2ddd0 6d 50 72 69 6e 74 28 26 73 53 75 62 42 75 69 6c  mPrint(&sSubBuil
2dde0 64 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b  d.pWC->a[i], i);
2ddf0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2de00 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69       }.#endif.#i
2de10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2de20 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
2de30 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72         if( IsVir
2de40 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62  tual(pItem->pTab
2de50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
2de60 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2de70 56 69 72 74 75 61 6c 28 26 73 53 75 62 42 75 69  Virtual(&sSubBui
2de80 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  ld, mExtra);.   
2de90 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
2dea0 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  f.        {.    
2deb0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2dec0 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73 53  LoopAddBtree(&sS
2ded0 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29  ubBuild, mExtra)
2dee0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2def0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2df00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2df10 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2df20 70 41 64 64 4f 72 28 26 73 53 75 62 42 75 69 6c  pAddOr(&sSubBuil
2df30 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  d, mExtra);.    
2df40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2df50 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2df60 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30  _OK || sCur.n==0
2df70 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2df80 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  sCur.n==0 ){.   
2df90 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20         sSum.n = 
2dfa0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
2dfb0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
2dfc0 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20  e if( once ){.  
2dfd0 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d          whereOrM
2dfe0 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72  ove(&sSum, &sCur
2dff0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63  );.          onc
2e000 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
2e010 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2e020 57 68 65 72 65 4f 72 53 65 74 20 73 50 72 65 76  WhereOrSet sPrev
2e030 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72  ;.          wher
2e040 65 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20  eOrMove(&sPrev, 
2e050 26 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  &sSum);.        
2e060 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20    sSum.n = 0;.  
2e070 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2e080 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29   i<sPrev.n; i++)
2e090 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
2e0a0 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b  r(j=0; j<sCur.n;
2e0b0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
2e0c0 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65       whereOrInse
2e0d0 72 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e  rt(&sSum, sPrev.
2e0e0 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43  a[i].prereq | sC
2e0f0 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a  ur.a[j].prereq,.
2e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e110 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2e120 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72  te3LogEstAdd(sPr
2e130 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43  ev.a[i].rRun, sC
2e140 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20  ur.a[j].rRun),. 
2e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e160 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2e170 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65  e3LogEstAdd(sPre
2e180 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75  v.a[i].nOut, sCu
2e190 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20  r.a[j].nOut));. 
2e1a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2e1b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e1c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2e1d0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
2e1e0 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  1;.      pNew->a
2e1f0 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
2e200 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
2e210 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55  Flags = WHERE_MU
2e220 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e  LTI_OR;.      pN
2e230 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
2e240 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
2e250 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  tIdx = 0;.      
2e260 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c  memset(&pNew->u,
2e270 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d   0, sizeof(pNew-
2e280 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  >u));.      for(
2e290 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
2e2a0 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20  OK && i<sSum.n; 
2e2b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  i++){.        /*
2e2c0 20 54 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74   TUNING: Current
2e2d0 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75  ly sSum.a[i].rRu
2e2e0 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
2e2f0 73 75 6d 20 6f 66 20 74 68 65 20 63 6f 73 74 73  sum of the costs
2e300 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  .        ** of a
2e310 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20 72 65 71  ll sub-scans req
2e320 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 2d  uired by the OR-
2e330 73 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64  scan. However, d
2e340 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20  ue to rounding. 
2e350 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73         ** errors
2e360 2c 20 69 74 20 6d 61 79 20 62 65 20 74 68 61 74  , it may be that
2e370 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65   the cost of the
2e380 20 4f 52 2d 73 63 61 6e 20 69 73 20 65 71 75 61   OR-scan is equa
2e390 6c 20 74 6f 20 69 74 73 0a 20 20 20 20 20 20 20  l to its.       
2e3a0 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73 69   ** most expensi
2e3b0 76 65 20 73 75 62 2d 73 63 61 6e 2e 20 41 64 64  ve sub-scan. Add
2e3c0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f   the smallest po
2e3d0 73 73 69 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a  ssible penalty .
2e3e0 20 20 20 20 20 20 20 20 2a 2a 20 28 65 71 75 69          ** (equi
2e3f0 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70  valent to multip
2e400 6c 79 69 6e 67 20 74 68 65 20 63 6f 73 74 20 62  lying the cost b
2e410 79 20 31 2e 30 37 29 20 74 6f 20 65 6e 73 75 72  y 1.07) to ensur
2e420 65 20 74 68 61 74 20 0a 20 20 20 20 20 20 20 20  e that .        
2e430 2a 2a 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  ** this does not
2e440 20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69   happen. Otherwi
2e450 73 65 2c 20 66 6f 72 20 57 48 45 52 45 20 63 6c  se, for WHERE cl
2e460 61 75 73 65 73 20 73 75 63 68 20 61 73 20 74 68  auses such as th
2e470 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c  e.        ** fol
2e480 6c 6f 77 69 6e 67 20 77 68 65 72 65 20 74 68 65  lowing where the
2e490 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f  re is an index o
2e4a0 6e 20 22 79 22 3a 0a 20 20 20 20 20 20 20 20 2a  n "y":.        *
2e4b0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  *.        **    
2e4c0 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f   WHERE likelihoo
2e4d0 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20  d(x=?, 0.99) OR 
2e4e0 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  y=?.        **. 
2e4f0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c         ** the pl
2e500 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63 74 20  anner may elect 
2e510 74 6f 20 22 4f 52 22 20 74 6f 67 65 74 68 65 72  to "OR" together
2e520 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63   a full-table sc
2e530 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  an and an.      
2e540 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75    ** index looku
2e550 70 2e 20 41 6e 64 20 6f 74 68 65 72 20 73 69 6d  p. And other sim
2e560 69 6c 61 72 6c 79 20 6f 64 64 20 72 65 73 75 6c  ilarly odd resul
2e570 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ts.  */.        
2e580 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75  pNew->rRun = sSu
2e590 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b  m.a[i].rRun + 1;
2e5a0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
2e5b0 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  Out = sSum.a[i].
2e5c0 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e  nOut;.        pN
2e5d0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75  ew->prereq = sSu
2e5e0 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20  m.a[i].prereq;. 
2e5f0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
2e600 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
2e610 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
2e620 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45     }.      WHERE
2e630 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 45  TRACE(0x200, ("E
2e640 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52  nd processing OR
2e650 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70  -clause %p\n", p
2e660 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Term));.    }.  
2e670 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2e680 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
2e690 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2e6a0 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  s for all tables
2e6b0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
2e6c0 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28  whereLoopAddAll(
2e6d0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
2e6e0 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57   *pBuilder){.  W
2e6f0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2e700 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
2e710 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  nfo;.  Bitmask m
2e720 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42 69 74  Extra = 0;.  Bit
2e730 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b  mask mPrior = 0;
2e740 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 53  .  int iTab;.  S
2e750 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
2e760 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2e770 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
2e780 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2e790 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
2e7a0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
2e7b0 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 54 61  e->db;.  int nTa
2e7c0 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
2e7d0 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20 72 63  nLevel;.  int rc
2e7e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2e7f0 75 38 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65  u8 priorJoinType
2e800 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f 6f   = 0;.  WhereLoo
2e810 70 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20 4c  p *pNew;..  /* L
2e820 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61 62  oop over the tab
2e830 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c  les in the join,
2e840 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
2e850 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20  ght */.  pNew = 
2e860 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
2e870 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
2e880 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 54 61  pNew);.  for(iTa
2e890 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c  b=0, pItem=pTabL
2e8a0 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e 54 61  ist->a; iTab<nTa
2e8b0 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c 20 70  bList; iTab++, p
2e8c0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70 4e 65  Item++){.    pNe
2e8d0 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b 0a  w->iTab = iTab;.
2e8e0 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65      pNew->maskSe
2e8f0 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57  lf = getMask(&pW
2e900 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
2e910 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
2e920 0a 20 20 20 20 69 66 28 20 28 28 70 49 74 65 6d  .    if( ((pItem
2e930 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72  ->jointype|prior
2e940 4a 6f 69 6e 54 79 70 65 29 20 26 20 28 4a 54 5f  JoinType) & (JT_
2e950 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21  LEFT|JT_CROSS))!
2e960 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 45 78 74  =0 ){.      mExt
2e970 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20  ra = mPrior;.   
2e980 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e   }.    priorJoin
2e990 54 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e 6a 6f  Type = pItem->jo
2e9a0 69 6e 74 79 70 65 3b 0a 20 20 20 20 69 66 28 20  intype;.    if( 
2e9b0 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d  IsVirtual(pItem-
2e9c0 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
2e9d0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2e9e0 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65  dVirtual(pBuilde
2e9f0 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  r, mExtra);.    
2ea00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2ea10 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
2ea20 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 45  ree(pBuilder, mE
2ea30 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xtra);.    }.   
2ea40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ea50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
2ea60 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
2ea70 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61  pBuilder, mExtra
2ea80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50 72  );.    }.    mPr
2ea90 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73  ior |= pNew->mas
2eaa0 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 72  kSelf;.    if( r
2eab0 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  c || db->mallocF
2eac0 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20  ailed ) break;. 
2ead0 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c   }.  whereLoopCl
2eae0 65 61 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ear(db, pNew);. 
2eaf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2eb00 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57  *.** Examine a W
2eb10 68 65 72 65 50 61 74 68 20 28 77 69 74 68 20 74  herePath (with t
2eb20 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74  he addition of t
2eb30 68 65 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f  he extra WhereLo
2eb40 6f 70 20 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a  op of the 5th.**
2eb50 20 70 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20   parameters) to 
2eb60 73 65 65 20 69 66 20 69 74 20 6f 75 74 70 75 74  see if it output
2eb70 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65  s rows in the re
2eb80 71 75 65 73 74 65 64 20 4f 52 44 45 52 20 42 59  quested ORDER BY
2eb90 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59  .** (or GROUP BY
2eba0 29 20 77 69 74 68 6f 75 74 20 72 65 71 75 69 72  ) without requir
2ebb0 69 6e 67 20 61 20 73 65 70 61 72 61 74 65 20 73  ing a separate s
2ebc0 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ort operation.  
2ebd0 52 65 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a  Return N:.** .**
2ebe0 20 20 20 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d     N>0:   N term
2ebf0 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
2ec00 59 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74  Y clause are sat
2ec10 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30  isfied.**   N==0
2ec20 3a 20 20 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74  :  No terms of t
2ec30 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2ec40 73 65 20 61 72 65 20 73 61 74 69 73 66 69 65 64  se are satisfied
2ec50 0a 2a 2a 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b  .**   N<0:   Unk
2ec60 6e 6f 77 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e  nown yet how man
2ec70 79 20 74 65 72 6d 73 20 6f 66 20 4f 52 44 45 52  y terms of ORDER
2ec80 20 42 59 20 6d 69 67 68 74 20 62 65 20 73 61 74   BY might be sat
2ec90 69 73 66 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a  isfied.   .**.**
2eca0 20 4e 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65   Note that proce
2ecb0 73 73 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f  ssing for WHERE_
2ecc0 47 52 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52  GROUPBY and WHER
2ecd0 45 5f 44 49 53 54 49 4e 43 54 42 59 20 69 73 20  E_DISTINCTBY is 
2ece0 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74  not as.** strict
2ecf0 2e 20 20 57 69 74 68 20 47 52 4f 55 50 20 42 59  .  With GROUP BY
2ed00 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68   and DISTINCT th
2ed10 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65  e only requireme
2ed20 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71  nt is that.** eq
2ed30 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70  uivalent rows ap
2ed40 70 65 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  pear immediately
2ed50 20 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65   adjacent to one
2ed60 20 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50   another.  GROUP
2ed70 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49   BY.** and DISTI
2ed80 4e 43 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69  NCT do not requi
2ed90 72 65 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61  re rows to appea
2eda0 72 20 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75  r in any particu
2edb0 6c 61 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e  lar order as lon
2edc0 67 0a 2a 2a 20 61 73 20 65 71 75 69 76 61 6c 65  g.** as equivale
2edd0 6e 74 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75  nt rows are grou
2ede0 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54  ped together.  T
2edf0 68 75 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59  hus for GROUP BY
2ee00 20 61 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a   and DISTINCT.**
2ee10 20 74 68 65 20 70 4f 72 64 65 72 42 79 20 74 65   the pOrderBy te
2ee20 72 6d 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68  rms can be match
2ee30 65 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e  ed in any order.
2ee40 20 20 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c    With ORDER BY,
2ee50 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42   the .** pOrderB
2ee60 79 20 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20  y terms must be 
2ee70 6d 61 74 63 68 65 64 20 69 6e 20 73 74 72 69 63  matched in stric
2ee80 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20  t left-to-right 
2ee90 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
2eea0 20 69 38 20 77 68 65 72 65 50 61 74 68 53 61 74   i8 wherePathSat
2eeb0 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20  isfiesOrderBy(. 
2eec0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2eed0 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48  fo,    /* The WH
2eee0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
2eef0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
2ef00 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42  By,   /* ORDER B
2ef10 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72  Y or GROUP BY or
2ef20 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65   DISTINCT clause
2ef30 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57   to check */.  W
2ef40 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c  herePath *pPath,
2ef50 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
2ef60 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a  ePath to check *
2ef70 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
2ef80 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69 67  gs,       /* Mig
2ef90 68 74 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45  ht contain WHERE
2efa0 5f 47 52 4f 55 50 42 59 20 6f 72 20 57 48 45 52  _GROUPBY or WHER
2efb0 45 5f 44 49 53 54 49 4e 43 54 42 59 20 2a 2f 0a  E_DISTINCTBY */.
2efc0 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20    u16 nLoop,    
2efd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2efe0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
2eff0 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a  pPath->aLoop[] *
2f000 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
2f010 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41 64 64  Last,     /* Add
2f020 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20   this WhereLoop 
2f030 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 70 50  to the end of pP
2f040 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a  ath->aLoop[] */.
2f050 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d    Bitmask *pRevM
2f060 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20  ask     /* OUT: 
2f070 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f  Mask of WhereLoo
2f080 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72 65 76  ps to run in rev
2f090 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b  erse order */.){
2f0a0 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20 20 20  .  u8 revSet;   
2f0b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2f0c0 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e   if rev is known
2f0d0 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20 20 20   */.  u8 rev;   
2f0e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2f0f0 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20 6f 72  omposite sort or
2f100 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 76 49  der */.  u8 revI
2f110 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dx;            /
2f120 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72 64  * Index sort ord
2f130 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64  er */.  u8 isOrd
2f140 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a  erDistinct;   /*
2f150 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65 72 65   All prior Where
2f160 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65 72 2d  Loops are order-
2f170 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38  distinct */.  u8
2f180 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
2f190 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ;   /* True if t
2f1a0 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51  he loop has UNIQ
2f1b0 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75  UE NOT NULL colu
2f1c0 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61  mns */.  u8 isMa
2f1d0 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f  tch;           /
2f1e0 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65  * iColumn matche
2f1f0 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20  s a term of the 
2f200 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2f210 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c  */.  u16 nKeyCol
2f220 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
2f230 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75  mber of key colu
2f240 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f  mns in pIndex */
2f250 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20  .  u16 nColumn; 
2f260 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
2f270 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64 65  l number of orde
2f280 72 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  red columns in t
2f290 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31  he index */.  u1
2f2a0 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  6 nOrderBy;     
2f2b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65      /* Number te
2f2c0 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
2f2d0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
2f2e0 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20  int iLoop;      
2f2f0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2f300 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70  f WhereLoop in p
2f310 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65  Path being proce
2f320 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ssed */.  int i,
2f330 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
2f340 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
2f350 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20   */.  int iCur; 
2f360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2f370 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
2f380 20 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f   current WhereLo
2f390 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  op */.  int iCol
2f3a0 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  umn;          /*
2f3b0 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72   A column number
2f3c0 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43   within table iC
2f3d0 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ur */.  WhereLoo
2f3e0 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a  p *pLoop = 0; /*
2f3f0 20 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f   Current WhereLo
2f400 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  op being process
2f410 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ed. */.  WhereTe
2f420 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f  rm *pTerm;     /
2f430 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
2f440 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2f450 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  use */.  Expr *p
2f460 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f  OBExpr;        /
2f470 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  * An expression 
2f480 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42  from the ORDER B
2f490 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f  Y clause */.  Co
2f4a0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
2f4b0 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66      /* COLLATE f
2f4c0 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20  unction from an 
2f4d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2f4e0 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20  term */.  Index 
2f4f0 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
2f500 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73 73  /* The index ass
2f510 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f  ociated with pLo
2f520 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  op */.  sqlite3 
2f530 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
2f540 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
2f550 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2f560 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f  n */.  Bitmask o
2f570 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  bSat = 0;    /* 
2f580 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59  Mask of ORDER BY
2f590 20 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64   terms satisfied
2f5a0 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74   so far */.  Bit
2f5b0 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20  mask obDone;    
2f5c0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c     /* Mask of al
2f5d0 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  l ORDER BY terms
2f5e0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72   */.  Bitmask or
2f5f0 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b  derDistinctMask;
2f600 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c    /* Mask of all
2f610 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f   well-ordered lo
2f620 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ops */.  Bitmask
2f630 20 72 65 61 64 79 3b 20 20 20 20 20 20 20 20 20   ready;         
2f640 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
2f650 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a  inner loops */..
2f660 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79    /*.  ** We say
2f670 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69   the WhereLoop i
2f680 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69  s "one-row" if i
2f690 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d  t generates no m
2f6a0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a  ore than one.  *
2f6b0 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e  * row of output.
2f6c0 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73    A WhereLoop is
2f6d0 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20   one-row if all 
2f6e0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2f6f0 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20   are true:.  ** 
2f700 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63   (a) All index c
2f710 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74  olumns match wit
2f720 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  h WHERE_COLUMN_E
2f730 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65  Q..  **  (b) The
2f740 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65   index is unique
2f750 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c  .  ** Any WhereL
2f760 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45 52  oop with an WHER
2f770 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73  E_COLUMN_EQ cons
2f780 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f  traint on the ro
2f790 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a  wid is one-row..
2f7a0 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72    ** Every one-r
2f7b0 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c  ow WhereLoop wil
2f7c0 6c 20 68 61 76 65 20 74 68 65 20 57 48 45 52 45  l have the WHERE
2f7d0 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20  _ONEROW bit set 
2f7e0 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a  in wsFlags..  **
2f7f0 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65  .  ** We say the
2f800 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f   WhereLoop is "o
2f810 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69  rder-distinct" i
2f820 66 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c  f the set of col
2f830 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  umns from.  ** t
2f840 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68  hat WhereLoop th
2f850 61 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52  at are in the OR
2f860 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
2f870 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  e different for 
2f880 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f  every.  ** row o
2f890 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  f the WhereLoop.
2f8a0 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20    Every one-row 
2f8b0 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74  WhereLoop is aut
2f8c0 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20  omatically.  ** 
2f8d0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20  order-distinct. 
2f8e0 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68    A WhereLoop th
2f8f0 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e  at has no column
2f900 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
2f910 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73  Y clause.  ** is
2f920 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69   not order-disti
2f930 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72  nct. To be order
2f940 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74  -distinct is not
2f950 20 71 75 69 74 65 20 74 68 65 20 73 61 6d 65 20   quite the same 
2f960 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e  as being.  ** UN
2f970 49 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49  IQUE since a UNI
2f980 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e  QUE column or in
2f990 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  dex can have mul
2f9a0 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20  tiple rows that 
2f9b0 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61  .  ** are NULL a
2f9c0 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  nd NULL values a
2f9d0 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f  re equivalent fo
2f9e0 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66  r the purpose of
2f9f0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
2fa00 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65  .  ** To be orde
2fa10 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20  r-distinct, the 
2fa20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20  columns must be 
2fa30 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e  UNIQUE and NOT N
2fa40 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ULL..  **.  ** T
2fa50 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74  he rowid for a t
2fa60 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55  able is always U
2fa70 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55  NIQUE and NOT NU
2fa80 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74  LL so whenever t
2fa90 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70  he.  ** rowid ap
2faa0 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44  pears in the ORD
2fab0 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
2fac0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
2fad0 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a  WhereLoop is.  *
2fae0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
2faf0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a  order-distinct..
2fb00 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20    */..  assert( 
2fb10 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
2fb20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70   if( nLoop && Op
2fb30 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
2fb40 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72  ed(db, SQLITE_Or
2fb50 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20  derByIdxJoin) ) 
2fb60 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72  return 0;..  nOr
2fb70 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
2fb80 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63  ->nExpr;.  testc
2fb90 61 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42  ase( nOrderBy==B
2fba0 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f  MS-1 );.  if( nO
2fbb0 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72  rderBy>BMS-1 ) r
2fbc0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e  eturn 0;  /* Can
2fbd0 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65  not optimize ove
2fbe0 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20  rly large ORDER 
2fbf0 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72  BYs */.  isOrder
2fc00 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20  Distinct = 1;.  
2fc10 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54  obDone = MASKBIT
2fc20 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20  (nOrderBy)-1;.  
2fc30 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
2fc40 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d  k = 0;.  ready =
2fc50 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   0;.  for(iLoop=
2fc60 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  0; isOrderDistin
2fc70 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f  ct && obSat<obDo
2fc80 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f  ne && iLoop<=nLo
2fc90 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
2fca0 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20    if( iLoop>0 ) 
2fcb0 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e  ready |= pLoop->
2fcc0 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c  maskSelf;.    pL
2fcd0 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  oop = iLoop<nLoo
2fce0 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70  p ? pPath->aLoop
2fcf0 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b  [iLoop] : pLast;
2fd00 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
2fd10 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2fd20 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a  VIRTUALTABLE ){.
2fd30 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
2fd40 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65  >u.vtab.isOrdere
2fd50 64 20 29 20 6f 62 53 61 74 20 3d 20 6f 62 44 6f  d ) obSat = obDo
2fd60 6e 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ne;.      break;
2fd70 0a 20 20 20 20 7d 0a 20 20 20 20 69 43 75 72 20  .    }.    iCur 
2fd80 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
2fd90 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61  st->a[pLoop->iTa
2fda0 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20  b].iCursor;..   
2fdb0 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
2fdc0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 58   ORDER BY term X
2fdd0 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d   that is a colum
2fde0 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  n in the table o
2fdf0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  f.    ** the cur
2fe00 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68  rent loop for wh
2fe10 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65 72  ich there is ter
2fe20 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20  m in the WHERE. 
2fe30 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
2fe40 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55  the form X IS NU
2fe50 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72  LL or X=? that r
2fe60 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75  eference only ou
2fe70 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73  ter.    ** loops
2fe80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
2fe90 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
2fea0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
2feb0 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
2fec0 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
2fed0 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d  .      pOBExpr =
2fee0 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
2fef0 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79  Collate(pOrderBy
2ff00 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
2ff10 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
2ff20 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
2ff30 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2ff40 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
2ff50 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f  Table!=iCur ) co
2ff60 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54  ntinue;.      pT
2ff70 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26  erm = findTerm(&
2ff80 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75  pWInfo->sWC, iCu
2ff90 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c  r, pOBExpr->iCol
2ffa0 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  umn,.           
2ffb0 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65 61              ~rea
2ffc0 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e  dy, WO_EQ|WO_ISN
2ffd0 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ULL, 0);.      i
2ffe0 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f  f( pTerm==0 ) co
2fff0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
30000 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
30010 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 26 26  tor&WO_EQ)!=0 &&
30020 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
30030 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
30040 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20  const char *z1, 
30050 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  *z2;.        pCo
30060 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
30070 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
30080 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
30090 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
300a0 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
300b0 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
300c0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
300d0 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a     z1 = pColl->z
300e0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43  Name;.        pC
300f0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
30100 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
30110 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  >pParse, pTerm->
30120 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
30130 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
30140 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
30150 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d  ll;.        z2 =
30160 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
30170 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
30180 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
30190 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
301a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f  .      }.      o
301b0 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
301c0 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  i);.    }..    i
301d0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
301e0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
301f0 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  W)==0 ){.      i
30200 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
30210 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b  s & WHERE_IPK ){
30220 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20  .        pIndex 
30230 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65  = 0;.        nKe
30240 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  yCol = 0;.      
30250 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20    nColumn = 1;. 
30260 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
30270 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e  pIndex = pLoop->
30280 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d  u.btree.pIndex)=
30290 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55  =0 || pIndex->bU
302a0 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20  nordered ){.    
302b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
302c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
302d0 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e     nKeyCol = pIn
302e0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  dex->nKeyCol;.  
302f0 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20        nColumn = 
30300 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
30310 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
30320 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f   nColumn==nKeyCo
30330 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77 69 64  l+1 || !HasRowid
30340 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29  (pIndex->pTable)
30350 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
30360 72 74 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  rt( pIndex->aiCo
30370 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d  lumn[nColumn-1]=
30380 3d 28 2d 31 29 20 7c 7c 20 21 48 61 73 52 6f 77  =(-1) || !HasRow
30390 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  id(pIndex->pTabl
303a0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f  e));.        isO
303b0 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 49  rderDistinct = I
303c0 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e  sUniqueIndex(pIn
303d0 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  dex);.      }.. 
303e0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
303f0 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  ough all columns
30400 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
30410 64 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20  d deal with the 
30420 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  ones.      ** th
30430 61 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74  at are not const
30440 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20  rained by == or 
30450 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  IN..      */.   
30460 20 20 20 72 65 76 20 3d 20 72 65 76 53 65 74 20     rev = revSet 
30470 3d 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69  = 0;.      disti
30480 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a  nctColumns = 0;.
30490 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
304a0 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  <nColumn; j++){.
304b0 20 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65          u8 bOnce
304c0 3b 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72  ;   /* True to r
304d0 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  un the ORDER BY 
304e0 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a  search loop */..
304f0 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20          /* Skip 
30500 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e  over == and IS N
30510 55 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  ULL terms */.   
30520 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70       if( j<pLoop
30530 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20  ->u.btree.nEq.  
30540 20 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d         && pLoop-
30550 3e 6e 53 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20  >nSkip==0.      
30560 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f     && ((i = pLoo
30570 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f  p->aLTerm[j]->eO
30580 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f 45  perator) & (WO_E
30590 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30  Q|WO_ISNULL))!=0
305a0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
305b0 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57 4f        if( i & WO
305c0 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
305d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
305e0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
305f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
30600 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
30610 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
30620 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
30630 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d  nue;  .        }
30640 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ..        /* Get
30650 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
30660 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  er in the table 
30670 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f  (iColumn) and so
30680 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  rt order.       
30690 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72   ** (revIdx) for
306a0 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
306b0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
306c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
306d0 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
306e0 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
306f0 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
30700 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
30710 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64     revIdx = pInd
30720 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  ex->aSortOrder[j
30730 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
30740 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78   iColumn==pIndex
30750 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
30760 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  ) iColumn = -1;.
30770 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30780 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
30790 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
307a0 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20   revIdx = 0;.   
307b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
307c0 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69  /* An unconstrai
307d0 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ned column that 
307e0 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65  might be NULL me
307f0 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20 20  ans that this.  
30800 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f        ** WhereLo
30810 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f  op is not well-o
30820 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a  rdered.        *
30830 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  /.        if( is
30840 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20  OrderDistinct.  
30850 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d         && iColum
30860 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  n>=0.         &&
30870 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72   j>=pLoop->u.btr
30880 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20  ee.nEq.         
30890 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  && pIndex->pTabl
308a0 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  e->aCol[iColumn]
308b0 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20  .notNull==0.    
308c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
308d0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
308e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
308f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64  .        /* Find
30900 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65   the ORDER BY te
30910 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  rm that correspo
30920 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20  nds to the j-th 
30930 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a  column.        *
30940 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  * of the index a
30950 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44  nd mark that ORD
30960 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a  ER BY term off .
30970 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30980 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20     bOnce = 1;.  
30990 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
309a0 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  0;.        for(i
309b0 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e  =0; bOnce && i<n
309c0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
309d0 20 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53           if( MAS
309e0 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
309f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
30a00 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20        pOBExpr = 
30a10 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
30a20 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d  ollate(pOrderBy-
30a30 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
30a40 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
30a50 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
30a60 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a  HERE_GROUPBY );.
30a70 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
30a80 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  se( wctrlFlags &
30a90 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
30aa0 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Y );.          i
30ab0 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
30ac0 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c   (WHERE_GROUPBY|
30ad0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
30ae0 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20  ))==0 ) bOnce = 
30af0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
30b00 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
30b10 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
30b20 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
30b30 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  ( pOBExpr->iTabl
30b40 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  e!=iCur ) contin
30b50 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
30b60 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  ( pOBExpr->iColu
30b70 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  mn!=iColumn ) co
30b80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
30b90 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30    if( iColumn>=0
30ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30bb0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
30bc0 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
30bd0 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65  o->pParse, pOrde
30be0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
30bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
30c00 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
30c10 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
30c20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
30c30 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
30c40 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70  (pColl->zName, p
30c50 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d  Index->azColl[j]
30c60 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
30c70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30c80 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d         isMatch =
30c90 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
30ca0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
30cb0 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74         if( isMat
30cc0 63 68 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67  ch && (wctrlFlag
30cd0 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42  s & WHERE_GROUPB
30ce0 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
30cf0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
30d00 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69  the sort order i
30d10 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20  s compatible in 
30d20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
30d30 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  se..          **
30d40 20 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69   Sort order is i
30d50 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20  rrelevant for a 
30d60 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
30d70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
30d80 28 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20  ( revSet ){.    
30d90 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76          if( (rev
30da0 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64   ^ revIdx)!=pOrd
30db0 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
30dc0 72 64 65 72 20 29 20 69 73 4d 61 74 63 68 20 3d  rder ) isMatch =
30dd0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
30de0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
30df0 20 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20   rev = revIdx ^ 
30e00 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
30e10 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
30e20 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20        if( rev ) 
30e30 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53  *pRevMask |= MAS
30e40 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20  KBIT(iLoop);.   
30e50 20 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20           revSet 
30e60 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
30e70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30e80 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29     if( isMatch )
30e90 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
30ea0 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
30eb0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
30ec0 65 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d  e( distinctColum
30ed0 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ns==0 );.       
30ee0 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c       distinctCol
30ef0 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  umns = 1;.      
30f00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30f10 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
30f20 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  (i);.        }el
30f30 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
30f40 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20   No match found 
30f50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
30f60 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43   j==0 || j<nKeyC
30f70 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
30f80 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
30f90 64 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29  derDistinct!=0 )
30fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73  ;.            is
30fb0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
30fc0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
30fd0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
30fe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30ff0 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76  } /* end Loop ov
31000 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c  er all index col
31010 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  umns */.      if
31020 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  ( distinctColumn
31030 73 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  s ){.        tes
31040 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
31050 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20  stinct==0 );.   
31060 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
31070 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  inct = 1;.      
31080 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69  }.    } /* end-i
31090 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f  f not one-row */
310a0 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
310b0 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45  f any other ORDE
310c0 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20  R BY terms that 
310d0 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20  reference pLoop 
310e0 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64  */.    if( isOrd
310f0 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  erDistinct ){.  
31100 20 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63      orderDistinc
31110 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e  tMask |= pLoop->
31120 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
31130 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
31140 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
31150 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
31160 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 65 72      Bitmask mTer
31170 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d  m;.        if( M
31180 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61  ASKBIT(i) & obSa
31190 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
311a0 20 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72        p = pOrder
311b0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
311c0 20 20 20 20 20 20 20 20 6d 54 65 72 6d 20 3d 20          mTerm = 
311d0 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 26  exprTableUsage(&
311e0 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
311f0 2c 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ,p);.        if(
31200 20 6d 54 65 72 6d 3d 3d 30 20 26 26 20 21 73 71   mTerm==0 && !sq
31210 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
31220 61 6e 74 28 70 29 20 29 20 63 6f 6e 74 69 6e 75  ant(p) ) continu
31230 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
31240 6d 54 65 72 6d 26 7e 6f 72 64 65 72 44 69 73 74  mTerm&~orderDist
31250 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a  inctMask)==0 ){.
31260 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20            obSat 
31270 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
31280 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31290 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e  .    }.  } /* En
312a0 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20  d the loop over 
312b0 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66  all WhereLoops f
312c0 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64  rom outer-most d
312d0 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73  own to inner-mos
312e0 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74  t */.  if( obSat
312f0 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72  ==obDone ) retur
31300 6e 20 28 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a  n (i8)nOrderBy;.
31310 20 20 69 66 28 20 21 69 73 4f 72 64 65 72 44 69    if( !isOrderDi
31320 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f  stinct ){.    fo
31330 72 28 69 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20  r(i=nOrderBy-1; 
31340 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  i>0; i--){.     
31350 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53   Bitmask m = MAS
31360 4b 42 49 54 28 69 29 20 2d 20 31 3b 0a 20 20 20  KBIT(i) - 1;.   
31370 20 20 20 69 66 28 20 28 6f 62 53 61 74 26 6d 29     if( (obSat&m)
31380 3d 3d 6d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==m ) return i;.
31390 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
313a0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
313b0 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49   -1;.}.../*.** I
313c0 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55  f the WHERE_GROU
313d0 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20  PBY flag is set 
313e0 69 6e 20 74 68 65 20 6d 61 73 6b 20 70 61 73 73  in the mask pass
313f0 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
31400 72 65 42 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68  reBegin(),.** th
31410 65 20 70 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65  e planner assume
31420 73 20 74 68 61 74 20 74 68 65 20 73 70 65 63 69  s that the speci
31430 66 69 65 64 20 70 4f 72 64 65 72 42 79 20 6c 69  fied pOrderBy li
31440 73 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  st is actually a
31450 20 47 52 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61   GROUP.** BY cla
31460 75 73 65 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79  use - and so any
31470 20 6f 72 64 65 72 20 74 68 61 74 20 67 72 6f 75   order that grou
31480 70 73 20 72 6f 77 73 20 61 73 20 72 65 71 75 69  ps rows as requi
31490 72 65 64 20 73 61 74 69 73 66 69 65 73 20 74 68  red satisfies th
314a0 65 0a 2a 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a  e.** request..**
314b0 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e  .** Normally, in
314c0 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
314d0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
314e0 72 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  r the caller to 
314f0 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65  determine.** whe
31500 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
31510 72 6f 77 73 20 61 72 65 20 72 65 61 6c 6c 79 20  rows are really 
31520 62 65 69 6e 67 20 64 65 6c 69 76 65 72 65 64 20  being delivered 
31530 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c  in sorted order,
31540 20 6f 72 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73   or.** just in s
31550 6f 6d 65 20 6f 74 68 65 72 20 6f 72 64 65 72 20  ome other order 
31560 74 68 61 74 20 70 72 6f 76 69 64 65 73 20 74 68  that provides th
31570 65 20 72 65 71 75 69 72 65 64 20 67 72 6f 75 70  e required group
31580 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a  ing. However,.**
31590 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 53 4f   if the WHERE_SO
315a0 52 54 42 59 47 52 4f 55 50 20 66 6c 61 67 20 69  RTBYGROUP flag i
315b0 73 20 61 6c 73 6f 20 70 61 73 73 65 64 20 74 6f  s also passed to
315c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
315d0 69 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  in(), then.** th
315e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
315f0 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  be called on the
31600 20 72 65 74 75 72 6e 65 64 20 57 68 65 72 65 49   returned WhereI
31610 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 49 74 20 72  nfo object. It r
31620 65 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69  eturns.** true i
31630 66 20 74 68 65 20 72 6f 77 73 20 72 65 61 6c 6c  f the rows reall
31640 79 20 77 69 6c 6c 20 62 65 20 73 6f 72 74 65 64  y will be sorted
31650 20 69 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   in the specifie
31660 64 20 6f 72 64 65 72 2c 20 6f 72 20 66 61 6c 73  d order, or fals
31670 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a  e.** otherwise..
31680 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
31690 65 2c 20 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a  e, assuming:.**.
316a0 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
316b0 58 20 69 31 20 4f 4e 20 74 31 28 78 2c 20 59 29  X i1 ON t1(x, Y)
316c0 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a  ;.**.** then.**.
316d0 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
316e0 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 78  OM t1 GROUP BY x
316f0 2c 79 20 4f 52 44 45 52 20 42 59 20 78 2c 79 3b  ,y ORDER BY x,y;
31700 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29     -- IsSorted()
31710 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  ==1.**   SELECT 
31720 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20  * FROM t1 GROUP 
31730 42 59 20 79 2c 78 20 4f 52 44 45 52 20 42 59 20  BY y,x ORDER BY 
31740 79 2c 78 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74  y,x;   -- IsSort
31750 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73  ed()==0.*/.int s
31760 71 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f 72  qlite3WhereIsSor
31770 74 65 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  ted(WhereInfo *p
31780 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73 65 72 74  WInfo){.  assert
31790 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
317a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f  lags & WHERE_GRO
317b0 55 50 42 59 20 29 3b 0a 20 20 61 73 73 65 72 74  UPBY );.  assert
317c0 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
317d0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52  lags & WHERE_SOR
317e0 54 42 59 47 52 4f 55 50 20 29 3b 0a 20 20 72 65  TBYGROUP );.  re
317f0 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72  turn pWInfo->sor
31800 74 65 64 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57  ted;.}..#ifdef W
31810 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
31820 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69  D./* For debuggi
31830 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a  ng use only: */.
31840 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
31850 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65  r *wherePathName
31860 28 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74  (WherePath *pPat
31870 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68  h, int nLoop, Wh
31880 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b  ereLoop *pLast){
31890 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
318a0 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20  Name[65];.  int 
318b0 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
318c0 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61  nLoop; i++){ zNa
318d0 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61  me[i] = pPath->a
318e0 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a  Loop[i]->cId; }.
318f0 20 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e    if( pLast ) zN
31900 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74  ame[i++] = pLast
31910 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69  ->cId;.  zName[i
31920 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
31930 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  zName;.}.#endif.
31940 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
31950 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  e cost of sortin
31960 67 20 6e 52 6f 77 20 72 6f 77 73 2c 20 61 73 73  g nRow rows, ass
31970 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20 6b  uming that the k
31980 65 79 73 20 68 61 76 65 20 0a 2a 2a 20 6e 4f 72  eys have .** nOr
31990 64 65 72 62 79 20 63 6f 6c 75 6d 6e 73 20 61 6e  derby columns an
319a0 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  d that the first
319b0 20 6e 53 6f 72 74 65 64 20 63 6f 6c 75 6d 6e 73   nSorted columns
319c0 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a   are already in.
319d0 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ** order..*/.sta
319e0 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65  tic LogEst where
319f0 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 57  SortingCost(.  W
31a00 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
31a10 2c 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 2c  ,.  LogEst nRow,
31a20 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 2c  .  int nOrderBy,
31a30 0a 20 20 69 6e 74 20 6e 53 6f 72 74 65 64 0a 29  .  int nSorted.)
31a40 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45  {.  /* TUNING: E
31a50 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66  stimated cost of
31a60 20 61 20 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c   a full external
31a70 20 73 6f 72 74 2c 20 77 68 65 72 65 20 4e 20 69   sort, where N i
31a80 73 20 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62  s .  ** the numb
31a90 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f  er of rows to so
31aa0 72 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  rt is:.  **.  **
31ab0 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a     cost = (3.0 *
31ac0 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20   N * log(N))..  
31ad0 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20  ** .  ** Or, if 
31ae0 74 68 65 20 6f 72 64 65 72 2d 62 79 20 63 6c 61  the order-by cla
31af0 75 73 65 20 68 61 73 20 58 20 74 65 72 6d 73 20  use has X terms 
31b00 62 75 74 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73  but only the las
31b10 74 20 59 20 0a 20 20 2a 2a 20 74 65 72 6d 73 20  t Y .  ** terms 
31b20 61 72 65 20 6f 75 74 20 6f 66 20 6f 72 64 65 72  are out of order
31b30 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72  , then block-sor
31b40 74 69 6e 67 20 77 69 6c 6c 20 72 65 64 75 63 65  ting will reduce
31b50 20 74 68 65 20 0a 20 20 2a 2a 20 73 6f 72 74 69   the .  ** sorti
31b60 6e 67 20 63 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a  ng cost to:.  **
31b70 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28  .  **   cost = (
31b80 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29  3.0 * N * log(N)
31b90 29 20 2a 20 28 59 2f 58 29 0a 20 20 2a 2a 0a 20  ) * (Y/X).  **. 
31ba0 20 2a 2a 20 54 68 65 20 28 59 2f 58 29 20 74 65   ** The (Y/X) te
31bb0 72 6d 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  rm is implemente
31bc0 64 20 75 73 69 6e 67 20 73 74 61 63 6b 20 76 61  d using stack va
31bd0 72 69 61 62 6c 65 20 72 53 63 61 6c 65 0a 20 20  riable rScale.  
31be0 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ** below.  */.  
31bf0 4c 6f 67 45 73 74 20 72 53 63 61 6c 65 2c 20 72  LogEst rScale, r
31c00 53 6f 72 74 43 6f 73 74 3b 0a 20 20 61 73 73 65  SortCost;.  asse
31c10 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 30 20 26  rt( nOrderBy>0 &
31c20 26 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  & 66==sqlite3Log
31c30 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20 72 53  Est(100) );.  rS
31c40 63 61 6c 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f  cale = sqlite3Lo
31c50 67 45 73 74 28 28 6e 4f 72 64 65 72 42 79 2d 6e  gEst((nOrderBy-n
31c60 53 6f 72 74 65 64 29 2a 31 30 30 2f 6e 4f 72 64  Sorted)*100/nOrd
31c70 65 72 42 79 29 20 2d 20 36 36 3b 0a 20 20 72 53  erBy) - 66;.  rS
31c80 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 20 2b  ortCost = nRow +
31c90 20 65 73 74 4c 6f 67 28 6e 52 6f 77 29 20 2b 20   estLog(nRow) + 
31ca0 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20  rScale + 16;..  
31cb0 2f 2a 20 54 55 4e 49 4e 47 3a 20 54 68 65 20 63  /* TUNING: The c
31cc0 6f 73 74 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  ost of implement
31cd0 69 6e 67 20 44 49 53 54 49 4e 43 54 20 75 73 69  ing DISTINCT usi
31ce0 6e 67 20 61 20 42 2d 54 52 45 45 20 69 73 0a 20  ng a B-TREE is. 
31cf0 20 2a 2a 20 73 69 6d 69 6c 61 72 20 62 75 74 20   ** similar but 
31d00 77 69 74 68 20 61 20 6c 61 72 67 65 72 20 63 6f  with a larger co
31d10 6e 73 74 61 6e 74 20 6f 66 20 70 72 6f 70 6f 72  nstant of propor
31d20 74 69 6f 6e 61 6c 69 74 79 2e 20 0a 20 20 2a 2a  tionality. .  **
31d30 20 4d 75 6c 74 69 70 6c 79 20 62 79 20 61 6e 20   Multiply by an 
31d40 61 64 64 69 74 69 6f 6e 61 6c 20 66 61 63 74 6f  additional facto
31d50 72 20 6f 66 20 33 2e 30 2e 20 20 2a 2f 0a 20 20  r of 3.0.  */.  
31d60 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  if( pWInfo->wctr
31d70 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
31d80 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
31d90 20 20 20 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d      rSortCost +=
31da0 20 31 36 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75   16;.  }..  retu
31db0 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a  rn rSortCost;.}.
31dc0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
31dd0 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f   list of WhereLo
31de0 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57  op objects at pW
31df0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68  Info->pLoops, th
31e00 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74  is routine.** at
31e10 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74  tempts to find t
31e20 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
31e30 61 74 68 20 74 68 61 74 20 76 69 73 69 74 73 20  ath that visits 
31e40 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a  each WhereLoop.*
31e50 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61  * once.  This pa
31e60 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65  th is then loade
31e70 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66  d into the pWInf
31e80 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69  o->a[].pWLoop fi
31e90 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75  elds..**.** Assu
31ea0 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f 74 61  me that the tota
31eb0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  l number of outp
31ec0 75 74 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  ut rows that wil
31ed0 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72  l need to be sor
31ee0 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e  ted.** will be n
31ef0 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20 31  RowEst (in the 1
31f00 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74  0*log2 represent
31f10 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e  ation).  Or, ign
31f20 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63  ore sorting.** c
31f30 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d  osts if nRowEst=
31f40 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  =0..**.** Return
31f50 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
31f60 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f  ccess or SQLITE_
31f70 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72  NOMEM of a memor
31f80 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  y allocation.** 
31f90 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
31fa0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
31fb0 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72  ePathSolver(Wher
31fc0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c  eInfo *pWInfo, L
31fd0 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a  ogEst nRowEst){.
31fe0 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20    int mxChoice; 
31ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
32000 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
32010 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61   simultaneous pa
32020 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20  ths tracked */. 
32030 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20   int nLoop;     
32040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
32050 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
32060 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50   the join */.  P
32070 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
32080 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
32090 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
320a0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
320b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
320c0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
320d0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
320e0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
320f0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
32100 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20 74 65  nter over the te
32110 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  rms of the join 
32120 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  */.  int ii, jj;
32130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32140 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
32150 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30  */.  int mxI = 0
32160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
32170 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20  * Index of next 
32180 65 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65  entry to replace
32190 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
321a0 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  By;             
321b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44  /* Number of ORD
321c0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
321d0 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d  ms */.  LogEst m
321e0 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20  xCost = 0;      
321f0 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73    /* Maximum cos
32200 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61  t of a set of pa
32210 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ths */.  LogEst 
32220 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20  mxUnsorted = 0; 
32230 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e     /* Maximum un
32240 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20 61  sorted cost of a
32250 20 73 65 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a   set of path */.
32260 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d    int nTo, nFrom
32270 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
32280 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65  umber of valid e
32290 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20  ntries in aTo[] 
322a0 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20  and aFrom[] */. 
322b0 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f   WherePath *aFro
322c0 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  m;         /* Al
322d0 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74  l nFrom paths at
322e0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65   the previous le
322f0 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
32300 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20  th *aTo;        
32310 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65     /* The nTo be
32320 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65 20  st paths at the 
32330 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f  current level */
32340 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 46  .  WherePath *pF
32350 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rom;         /* 
32360 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46  An element of aF
32370 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72  rom[] that we ar
32380 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
32390 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f    WherePath *pTo
323a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
323b0 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f  n element of aTo
323c0 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
323d0 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
323e0 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70  hereLoop *pWLoop
323f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
32400 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
32410 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68   objects */.  Wh
32420 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20  ereLoop **pX;   
32430 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
32440 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20 70  to divy up the p
32450 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  Space memory */.
32460 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74 43    LogEst *aSortC
32470 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53  ost = 0;    /* S
32480 6f 72 74 69 6e 67 20 61 6e 64 20 70 61 72 74 69  orting and parti
32490 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 73  al sorting costs
324a0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
324b0 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
324c0 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d  /* Temporary mem
324d0 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69 73  ory used by this
324e0 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e   routine */.  in
324f0 74 20 6e 53 70 61 63 65 3b 20 20 20 20 20 20 20  t nSpace;       
32500 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
32510 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
32520 74 65 64 20 61 74 20 70 53 70 61 63 65 20 2a 2f  ted at pSpace */
32530 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ..  pParse = pWI
32540 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  nfo->pParse;.  d
32550 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
32560 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f    nLoop = pWInfo
32570 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54  ->nLevel;.  /* T
32580 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c  UNING: For simpl
32590 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20  e queries, only 
325a0 74 68 65 20 62 65 73 74 20 70 61 74 68 20 69 73  the best path is
325b0 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46   tracked..  ** F
325c0 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20  or 2-way joins, 
325d0 74 68 65 20 35 20 62 65 73 74 20 70 61 74 68 73  the 5 best paths
325e0 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20   are followed.. 
325f0 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66   ** For joins of
32600 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65   3 or more table
32610 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30 20  s, track the 10 
32620 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20  best paths */.  
32630 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f  mxChoice = (nLoo
32640 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f  p<=1) ? 1 : (nLo
32650 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b  op==2 ? 5 : 10);
32660 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70  .  assert( nLoop
32670 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  <=pWInfo->pTabLi
32680 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48  st->nSrc );.  WH
32690 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 20  ERETRACE(0x002, 
326a0 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c  ("---- begin sol
326b0 76 65 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25  ver.  (nRowEst=%
326c0 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  d)\n", nRowEst))
326d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45  ;..  /* If nRowE
326e0 73 74 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74  st is zero and t
326f0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
32700 20 42 59 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f   BY clause, igno
32710 72 65 20 69 74 2e 20 49 6e 20 74 68 69 73 0a 20  re it. In this. 
32720 20 2a 2a 20 63 61 73 65 20 74 68 65 20 70 75 72   ** case the pur
32730 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c  pose of this cal
32740 6c 20 69 73 20 74 6f 20 65 73 74 69 6d 61 74 65  l is to estimate
32750 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
32760 6f 77 73 20 72 65 74 75 72 6e 65 64 0a 20 20 2a  ows returned.  *
32770 2a 20 62 79 20 74 68 65 20 6f 76 65 72 61 6c 6c  * by the overall
32780 20 71 75 65 72 79 2e 20 4f 6e 63 65 20 74 68 69   query. Once thi
32790 73 20 65 73 74 69 6d 61 74 65 20 68 61 73 20 62  s estimate has b
327a0 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  een obtained, th
327b0 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69  e caller.  ** wi
327c0 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66  ll invoke this f
327d0 75 6e 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64  unction a second
327e0 20 74 69 6d 65 2c 20 70 61 73 73 69 6e 67 20 74   time, passing t
327f0 68 65 20 65 73 74 69 6d 61 74 65 20 61 73 20 74  he estimate as t
32800 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20  he.  ** nRowEst 
32810 70 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20  parameter.  */. 
32820 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
32830 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77  derBy==0 || nRow
32840 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f  Est==0 ){.    nO
32850 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65  rderBy = 0;.  }e
32860 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42  lse{.    nOrderB
32870 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  y = pWInfo->pOrd
32880 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  erBy->nExpr;.  }
32890 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
328a0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73  and initialize s
328b0 70 61 63 65 20 66 6f 72 20 61 54 6f 2c 20 61 46  pace for aTo, aF
328c0 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f 73  rom and aSortCos
328d0 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20  t[] */.  nSpace 
328e0 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50  = (sizeof(WhereP
328f0 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72  ath)+sizeof(Wher
32900 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d  eLoop*)*nLoop)*m
32910 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70  xChoice*2;.  nSp
32920 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f  ace += sizeof(Lo
32930 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79  gEst) * nOrderBy
32940 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c  ;.  pSpace = sql
32950 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
32960 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69  db, nSpace);.  i
32970 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72  f( pSpace==0 ) r
32980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
32990 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68 65  EM;.  aTo = (Whe
329a0 72 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b 0a  rePath*)pSpace;.
329b0 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78    aFrom = aTo+mx
329c0 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74  Choice;.  memset
329d0 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f  (aFrom, 0, sizeo
329e0 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20  f(aFrom[0]));.  
329f0 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a  pX = (WhereLoop*
32a00 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63  *)(aFrom+mxChoic
32a10 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43  e);.  for(ii=mxC
32a20 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61  hoice*2, pFrom=a
32a30 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20  To; ii>0; ii--, 
32a40 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e  pFrom++, pX += n
32a50 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d  Loop){.    pFrom
32a60 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20  ->aLoop = pX;.  
32a70 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79  }.  if( nOrderBy
32a80 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
32a90 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
32aa0 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 69 74  BY clause and it
32ab0 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 69 67   is not being ig
32ac0 6e 6f 72 65 64 2c 20 73 65 74 20 75 70 0a 20 20  nored, set up.  
32ad0 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74    ** space for t
32ae0 68 65 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 61  he aSortCost[] a
32af0 72 72 61 79 2e 20 45 61 63 68 20 65 6c 65 6d 65  rray. Each eleme
32b00 6e 74 20 6f 66 20 74 68 65 20 61 53 6f 72 74 43  nt of the aSortC
32b10 6f 73 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2a  ost array.    **
32b20 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 20   is either zero 
32b30 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20 68 61 73  - meaning it has
32b40 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 69 6e   not yet been in
32b50 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f 72 20 74  itialized - or t
32b60 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f  he.    ** cost o
32b70 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 45 73  f sorting nRowEs
32b80 74 20 72 6f 77 73 20 6f 66 20 64 61 74 61 20 77  t rows of data w
32b90 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20 58  here the first X
32ba0 20 74 65 72 6d 73 20 6f 66 0a 20 20 20 20 2a 2a   terms of.    **
32bb0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
32bc0 61 75 73 65 20 61 72 65 20 61 6c 72 65 61 64 79  ause are already
32bd0 20 69 6e 20 6f 72 64 65 72 2c 20 77 68 65 72 65   in order, where
32be0 20 58 20 69 73 20 74 68 65 20 61 72 72 61 79 20   X is the array 
32bf0 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20  .    ** index.  
32c00 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43 6f 73 74  */.    aSortCost
32c10 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 58 3b 0a   = (LogEst*)pX;.
32c20 20 20 20 20 6d 65 6d 73 65 74 28 61 53 6f 72 74      memset(aSort
32c30 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Cost, 0, sizeof(
32c40 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72  LogEst) * nOrder
32c50 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  By);.  }.  asser
32c60 74 28 20 61 53 6f 72 74 43 6f 73 74 3d 3d 30 20  t( aSortCost==0 
32c70 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63  || &pSpace[nSpac
32c80 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61 53 6f 72  e]==(char*)&aSor
32c90 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42 79 5d 20  tCost[nOrderBy] 
32ca0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f  );.  assert( aSo
32cb0 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20 26 70 53  rtCost!=0 || &pS
32cc0 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63  pace[nSpace]==(c
32cd0 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20 20 2f 2a  har*)pX );..  /*
32ce0 20 53 65 65 64 20 74 68 65 20 73 65 61 72 63 68   Seed the search
32cf0 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57   with a single W
32d00 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e  herePath contain
32d10 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f  ing zero WhereLo
32d20 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ops..  **.  ** T
32d30 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65  UNING: Do not le
32d40 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
32d50 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61 62  iterations go ab
32d60 6f 76 65 20 32 35 2e 20 20 49 66 20 74 68 65 20  ove 25.  If the 
32d70 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d  cost.  ** of com
32d80 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61  puting an automa
32d90 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  tic index is not
32da0 20 70 61 69 64 20 62 61 63 6b 20 77 69 74 68 69   paid back withi
32db0 6e 20 74 68 65 20 66 69 72 73 74 20 32 35 0a 20  n the first 25. 
32dc0 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 64   ** rows, then d
32dd0 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61 75  o not use the au
32de0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a  tomatic index. *
32df0 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f  /.  aFrom[0].nRo
32e00 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e  w = MIN(pParse->
32e10 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 36 29 3b  nQueryLoop, 46);
32e20 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71    assert( 46==sq
32e30 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20  lite3LogEst(25) 
32e40 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a  );.  nFrom = 1;.
32e50 20 20 61 73 73 65 72 74 28 20 61 46 72 6f 6d 5b    assert( aFrom[
32e60 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d 3d 30 20  0].isOrdered==0 
32e70 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42  );.  if( nOrderB
32e80 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  y ){.    /* If n
32e90 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c 20 74 68  Loop is zero, th
32ea0 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
32eb0 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e 20 74 68  FROM terms in th
32ec0 65 20 71 75 65 72 79 2e 20 53 69 6e 63 65 0a 20  e query. Since. 
32ed0 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61     ** in this ca
32ee0 73 65 20 74 68 65 20 71 75 65 72 79 20 6d 61 79  se the query may
32ef0 20 72 65 74 75 72 6e 20 61 20 6d 61 78 69 6d 75   return a maximu
32f00 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c 20 74 68  m of one row, th
32f10 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a  e results.    **
32f20 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
32f30 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6f 72  the requested or
32f40 64 65 72 2e 20 53 65 74 20 69 73 4f 72 64 65 72  der. Set isOrder
32f50 65 64 20 74 6f 20 6e 4f 72 64 65 72 42 79 20 74  ed to nOrderBy t
32f60 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74  o.    ** indicat
32f70 65 20 74 68 69 73 2e 20 4f 72 2c 20 69 66 20 6e  e this. Or, if n
32f80 4c 6f 6f 70 20 69 73 20 67 72 65 61 74 65 72 20  Loop is greater 
32f90 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65 74 20 69  than zero, set i
32fa0 73 4f 72 64 65 72 65 64 20 74 6f 0a 20 20 20 20  sOrdered to.    
32fb0 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  ** -1, indicatin
32fc0 67 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  g that the resul
32fd0 74 20 73 65 74 20 6d 61 79 20 6f 72 20 6d 61 79  t set may or may
32fe0 20 6e 6f 74 20 62 65 20 6f 72 64 65 72 65 64 2c   not be ordered,
32ff0 20 0a 20 20 20 20 2a 2a 20 64 65 70 65 6e 64 69   .    ** dependi
33000 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f 70 73 20  ng on the loops 
33010 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 75 72  added to the cur
33020 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20  rent plan.  */. 
33030 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72     aFrom[0].isOr
33040 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20  dered = nLoop>0 
33050 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72 42 79 3b  ? -1 : nOrderBy;
33060 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
33070 74 65 20 73 75 63 63 65 73 73 69 76 65 6c 79 20  te successively 
33080 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74 68  longer WherePath
33090 73 20 75 73 69 6e 67 20 74 68 65 20 70 72 65 76  s using the prev
330a0 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a  ious generation.
330b0 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61 74    ** of WherePat
330c0 68 73 20 61 73 20 74 68 65 20 62 61 73 69 73 20  hs as the basis 
330d0 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20 4b  for the next.  K
330e0 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
330f0 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62   mxChoice.  ** b
33100 65 73 74 20 70 61 74 68 73 20 61 74 20 65 61 63  est paths at eac
33110 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  h generation */.
33120 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69    for(iLoop=0; i
33130 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  Loop<nLoop; iLoo
33140 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20  p++){.    nTo = 
33150 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 2c  0;.    for(ii=0,
33160 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69   pFrom=aFrom; ii
33170 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46  <nFrom; ii++, pF
33180 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  rom++){.      fo
33190 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d  r(pWLoop=pWInfo-
331a0 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b  >pLoops; pWLoop;
331b0 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e   pWLoop=pWLoop->
331c0 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20  pNextLoop){.    
331d0 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b      LogEst nOut;
331e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
331f0 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 76 69        /* Rows vi
33200 73 69 74 65 64 20 62 79 20 28 70 46 72 6f 6d 2b  sited by (pFrom+
33210 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20  pWLoop) */.     
33220 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b     LogEst rCost;
33230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33240 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
33250 70 61 74 68 20 28 70 46 72 6f 6d 2b 70 57 4c 6f  path (pFrom+pWLo
33260 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c  op) */.        L
33270 6f 67 45 73 74 20 72 55 6e 73 6f 72 74 65 64 3b  ogEst rUnsorted;
33280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33290 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20 63 6f 73   /* Unsorted cos
332a0 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70 57 4c 6f  t of (pFrom+pWLo
332b0 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  op) */.        i
332c0 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46  8 isOrdered = pF
332d0 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 20  rom->isOrdered; 
332e0 20 2f 2a 20 69 73 4f 72 64 65 72 65 64 20 66 6f   /* isOrdered fo
332f0 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  r (pFrom+pWLoop)
33300 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d   */.        Bitm
33310 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20 20 20 20  ask maskNew;    
33320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33330 20 4d 61 73 6b 20 6f 66 20 73 72 63 20 76 69 73   Mask of src vis
33340 69 74 65 64 20 62 79 20 28 2e 2e 29 20 2a 2f 0a  ited by (..) */.
33350 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
33360 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  revMask = 0;    
33370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
33380 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65 72 20 6c  k of rev-order l
33390 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29 20 2a 2f  oops for (..) */
333a0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ..        if( (p
333b0 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20  WLoop->prereq & 
333c0 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70  ~pFrom->maskLoop
333d0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
333e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
333f0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26  Loop->maskSelf &
33400 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
33410 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
33420 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74  .        /* At t
33430 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f  his point, pWLoo
33440 70 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  p is a candidate
33450 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20   to be the next 
33460 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a  loop. .        *
33470 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f  * Compute its co
33480 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 55  st */.        rU
33490 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nsorted = sqlite
334a0 33 4c 6f 67 45 73 74 41 64 64 28 70 57 4c 6f 6f  3LogEstAdd(pWLoo
334b0 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70  p->rSetup,pWLoop
334c0 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e  ->rRun + pFrom->
334d0 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72  nRow);.        r
334e0 55 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74  Unsorted = sqlit
334f0 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73  e3LogEstAdd(rUns
33500 6f 72 74 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55  orted, pFrom->rU
33510 6e 73 6f 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nsorted);.      
33520 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e    nOut = pFrom->
33530 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e  nRow + pWLoop->n
33540 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73  Out;.        mas
33550 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61  kNew = pFrom->ma
33560 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d  skLoop | pWLoop-
33570 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
33580 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64     if( isOrdered
33590 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
335a0 69 73 4f 72 64 65 72 65 64 20 3d 20 77 68 65 72  isOrdered = wher
335b0 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
335c0 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20  derBy(pWInfo,.  
335d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
335e0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
335f0 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57  derBy, pFrom, pW
33600 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
33610 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
33620 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20           iLoop, 
33630 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b  pWLoop, &revMask
33640 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
33650 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 4d  {.          revM
33660 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76  ask = pFrom->rev
33670 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Loop;.        }.
33680 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72          if( isOr
33690 64 65 72 65 64 3e 3d 30 20 26 26 20 69 73 4f 72  dered>=0 && isOr
336a0 64 65 72 65 64 3c 6e 4f 72 64 65 72 42 79 20 29  dered<nOrderBy )
336b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
336c0 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65  aSortCost[isOrde
336d0 72 65 64 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  red]==0 ){.     
336e0 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74         aSortCost
336f0 5b 69 73 4f 72 64 65 72 65 64 5d 20 3d 20 77 68  [isOrdered] = wh
33700 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a  ereSortingCost(.
33710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33720 70 57 49 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c  pWInfo, nRowEst,
33730 20 6e 4f 72 64 65 72 42 79 2c 20 69 73 4f 72 64   nOrderBy, isOrd
33740 65 72 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  ered.           
33750 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   );.          }.
33760 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20            rCost 
33770 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
33780 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 61 53  dd(rUnsorted, aS
33790 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
337a0 64 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  d]);..          
337b0 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32  WHERETRACE(0x002
337c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
337d0 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74  ("---- sort cost
337e0 3d 25 2d 33 64 20 28 25 64 2f 25 64 29 20 69 6e  =%-3d (%d/%d) in
337f0 63 72 65 61 73 65 73 20 63 6f 73 74 20 25 33 64  creases cost %3d
33800 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20   to %-3d\n",.   
33810 20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f 72              aSor
33820 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d  tCost[isOrdered]
33830 2c 20 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72  , (nOrderBy-isOr
33840 64 65 72 65 64 29 2c 20 6e 4f 72 64 65 72 42 79  dered), nOrderBy
33850 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
33860 20 20 72 55 6e 73 6f 72 74 65 64 2c 20 72 43 6f    rUnsorted, rCo
33870 73 74 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  st));.        }e
33880 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
33890 43 6f 73 74 20 3d 20 72 55 6e 73 6f 72 74 65 64  Cost = rUnsorted
338a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
338b0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
338c0 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73   see if pWLoop s
338d0 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20 74  hould be added t
338e0 6f 20 74 68 65 20 73 65 74 20 6f 66 0a 20 20 20  o the set of.   
338f0 20 20 20 20 20 2a 2a 20 6d 78 43 68 6f 69 63 65       ** mxChoice
33900 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
33910 68 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  hs..        **. 
33920 20 20 20 20 20 20 20 2a 2a 20 46 69 72 73 74 20         ** First 
33930 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73  look for an exis
33940 74 69 6e 67 20 70 61 74 68 20 61 6d 6f 6e 67 20  ting path among 
33950 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68  best-so-far path
33960 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
33970 74 20 63 6f 76 65 72 73 20 74 68 65 20 73 61 6d  t covers the sam
33980 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61  e set of loops a
33990 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  nd has the same 
339a0 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20  isOrdered.      
339b0 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 73 20    ** setting as 
339c0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 74 68  the current path
339d0 20 63 61 6e 64 69 64 61 74 65 2e 0a 20 20 20 20   candidate..    
339e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
339f0 2a 20 54 68 65 20 74 65 72 6d 20 22 28 28 70 54  * The term "((pT
33a00 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f  o->isOrdered^isO
33a10 72 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30  rdered)&0x80)==0
33a20 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 0a  " is equivalent.
33a30 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 28 70          ** to (p
33a40 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 28  To->isOrdered==(
33a50 2d 31 29 29 3d 3d 28 69 73 4f 72 64 65 72 65 64  -1))==(isOrdered
33a60 3d 3d 28 2d 31 29 29 22 20 66 6f 72 20 74 68 65  ==(-1))" for the
33a70 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20 2a   range.        *
33a80 2a 20 6f 66 20 6c 65 67 61 6c 20 76 61 6c 75 65  * of legal value
33a90 73 20 66 6f 72 20 69 73 4f 72 64 65 72 65 64 2c  s for isOrdered,
33aa0 20 2d 31 2e 2e 36 34 2e 0a 20 20 20 20 20 20 20   -1..64..       
33ab0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
33ac0 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a  jj=0, pTo=aTo; j
33ad0 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f  j<nTo; jj++, pTo
33ae0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
33af0 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70  f( pTo->maskLoop
33b00 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20 20  ==maskNew.      
33b10 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d 3e 69       && ((pTo->i
33b20 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72  sOrdered^isOrder
33b30 65 64 29 26 30 78 38 30 29 3d 3d 30 0a 20 20 20  ed)&0x80)==0.   
33b40 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
33b50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
33b60 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20  jj==nTo-1 );.   
33b70 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
33b80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
33b90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
33ba0 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20  ( jj>=nTo ){.   
33bb0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f         /* None o
33bc0 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 62  f the existing b
33bd0 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
33be0 20 6d 61 74 63 68 20 74 68 65 20 63 61 6e 64 69   match the candi
33bf0 64 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  date. */.       
33c00 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68     if( nTo>=mxCh
33c10 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20 20 20  oice.           
33c20 26 26 20 28 72 43 6f 73 74 3e 6d 78 43 6f 73 74  && (rCost>mxCost
33c30 20 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d 78 43 6f   || (rCost==mxCo
33c40 73 74 20 26 26 20 72 55 6e 73 6f 72 74 65 64 3e  st && rUnsorted>
33c50 3d 6d 78 55 6e 73 6f 72 74 65 64 29 29 0a 20 20  =mxUnsorted)).  
33c60 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
33c70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
33c80 72 72 65 6e 74 20 63 61 6e 64 69 64 61 74 65 20  rrent candidate 
33c90 69 73 20 6e 6f 20 62 65 74 74 65 72 20 74 68 61  is no better tha
33ca0 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6d 78 43  n any of the mxC
33cb0 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20 20  hoice.          
33cc0 20 20 2a 2a 20 70 61 74 68 73 20 63 75 72 72 65    ** paths curre
33cd0 6e 74 6c 79 20 69 6e 20 74 68 65 20 62 65 73 74  ntly in the best
33ce0 2d 73 6f 2d 66 61 72 20 62 75 66 66 65 72 2e 20  -so-far buffer. 
33cf0 20 53 6f 20 64 69 73 63 61 72 64 0a 20 20 20 20   So discard.    
33d00 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
33d10 63 61 6e 64 69 64 61 74 65 20 61 73 20 6e 6f 74  candidate as not
33d20 20 76 69 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64   viable. */.#ifd
33d30 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
33d40 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
33d50 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
33d60 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
33d70 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
33d80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
33d90 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20  bugPrintf("Skip 
33da0 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
33db0 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
33dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33dd0 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
33de0 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
33df0 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
33e00 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
33e10 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
33e20 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
33e30 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
33e40 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
33e50 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
33e60 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
33e70 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  }.          /* I
33e80 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
33e90 70 6f 69 6e 74 73 20 69 74 20 6d 65 61 6e 73 20  points it means 
33ea0 74 68 61 74 20 74 68 65 20 6e 65 77 20 63 61 6e  that the new can
33eb0 64 69 64 61 74 65 20 70 61 74 68 0a 20 20 20 20  didate path.    
33ec0 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 73 20 74        ** needs t
33ed0 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
33ee0 65 20 73 65 74 20 6f 66 20 62 65 73 74 2d 73 6f  e set of best-so
33ef0 2d 66 61 72 20 70 61 74 68 73 2e 20 2a 2f 0a 20  -far paths. */. 
33f00 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f           if( nTo
33f10 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20  <mxChoice ){.   
33f20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72           /* Incr
33f30 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ease the size of
33f40 20 74 68 65 20 61 54 6f 20 73 65 74 20 62 79 20   the aTo set by 
33f50 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  one */.         
33f60 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20     jj = nTo++;. 
33f70 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
33f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
33f90 65 77 20 70 61 74 68 20 72 65 70 6c 61 63 65 73  ew path replaces
33fa0 20 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74   the prior worst
33fb0 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62   to keep count b
33fc0 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f  elow mxChoice */
33fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
33fe0 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20 20 20 20  = mxI;.         
33ff0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f   }.          pTo
34000 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66   = &aTo[jj];.#if
34010 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
34020 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
34030 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
34040 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
34050 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
34060 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
34070 50 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25  Printf("New    %
34080 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
34090 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
340a0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
340b0 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
340c0 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
340d0 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
340e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
340f0 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
34100 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
34110 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ');.          }.
34120 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
34130 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
34140 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68  /* Control reach
34150 65 73 20 68 65 72 65 20 69 66 20 62 65 73 74 2d  es here if best-
34160 73 6f 2d 66 61 72 20 70 61 74 68 20 70 54 6f 3d  so-far path pTo=
34170 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73 20 74  aTo[jj] covers t
34180 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
34190 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70  same set of loop
341a0 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61  s and has the sa
341b0 6d 20 69 73 4f 72 64 65 72 65 64 20 73 65 74 74  m isOrdered sett
341c0 69 6e 67 20 61 73 20 74 68 65 0a 20 20 20 20 20  ing as the.     
341d0 20 20 20 20 20 2a 2a 20 63 61 6e 64 69 64 61 74       ** candidat
341e0 65 20 70 61 74 68 2e 20 20 43 68 65 63 6b 20 74  e path.  Check t
341f0 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 61 6e  o see if the can
34200 64 69 64 61 74 65 20 73 68 6f 75 6c 64 20 72 65  didate should re
34210 70 6c 61 63 65 0a 20 20 20 20 20 20 20 20 20 20  place.          
34220 2a 2a 20 70 54 6f 20 6f 72 20 69 66 20 74 68 65  ** pTo or if the
34230 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c   candidate shoul
34240 64 20 62 65 20 73 6b 69 70 70 65 64 20 2a 2f 0a  d be skipped */.
34250 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
34260 6f 2d 3e 72 43 6f 73 74 3c 72 43 6f 73 74 20 7c  o->rCost<rCost |
34270 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  | (pTo->rCost==r
34280 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f  Cost && pTo->nRo
34290 77 3c 3d 6e 4f 75 74 29 20 29 7b 0a 23 69 66 64  w<=nOut) ){.#ifd
342a0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
342b0 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
342c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
342d0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
342e0 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
342f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
34300 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20  bugPrintf(.     
34310 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 6b               "Sk
34320 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  ip   %s cost=%-3
34330 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  d,%3d order=%c",
34340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34350 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
34360 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
34370 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
34380 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
34390 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
343a0 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
343b0 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
343c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
343d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
343e0 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64   vs %s cost=%-3d
343f0 2c 25 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  ,%d order=%c\n",
34400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34410 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
34420 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
34430 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
34440 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
34450 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d              pTo-
34460 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20  >isOrdered>=0 ? 
34470 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27  pTo->isOrdered+'
34480 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
34490 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
344a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
344b0 69 73 63 61 72 64 20 74 68 65 20 63 61 6e 64 69  iscard the candi
344c0 64 61 74 65 20 70 61 74 68 20 66 72 6f 6d 20 66  date path from f
344d0 75 72 74 68 65 72 20 63 6f 6e 73 69 64 65 72 61  urther considera
344e0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
344f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
34500 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20  o->rCost==rCost 
34510 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  );.            c
34520 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
34530 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
34540 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43  estcase( pTo->rC
34550 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a  ost==rCost+1 );.
34560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
34570 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72  trol reaches her
34580 65 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61  e if the candida
34590 74 65 20 70 61 74 68 20 69 73 20 62 65 74 74 65  te path is bette
345a0 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20  r than the.     
345b0 20 20 20 20 20 2a 2a 20 70 54 6f 20 70 61 74 68       ** pTo path
345c0 2e 20 20 52 65 70 6c 61 63 65 20 70 54 6f 20 77  .  Replace pTo w
345d0 69 74 68 20 74 68 65 20 63 61 6e 64 69 64 61 74  ith the candidat
345e0 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45  e. */.#ifdef WHE
345f0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
34600 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
34610 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
34620 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
34630 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
34640 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
34650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34660 20 22 55 70 64 61 74 65 20 25 73 20 63 6f 73 74   "Update %s cost
34670 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
34680 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
34690 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
346a0 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
346b0 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
346c0 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
346d0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
346e0 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
346f0 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
34700 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
34710 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 77 61  ebugPrintf("  wa
34720 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  s %s cost=%-3d,%
34730 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
34740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34750 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54  wherePathName(pT
34760 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20  o, iLoop+1, 0), 
34770 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d  pTo->rCost, pTo-
34780 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  >nRow,.         
34790 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
347a0 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e  dered>=0 ? pTo->
347b0 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
347c0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
347d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
347e0 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57   }.        /* pW
347f0 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72  Loop is a winner
34800 2e 20 20 41 64 64 20 69 74 20 74 6f 20 74 68 65  .  Add it to the
34810 20 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20   set of best so 
34820 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  far */.        p
34830 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70  To->maskLoop = p
34840 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c  From->maskLoop |
34850 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c   pWLoop->maskSel
34860 66 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  f;.        pTo->
34870 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73  revLoop = revMas
34880 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  k;.        pTo->
34890 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20  nRow = nOut;.   
348a0 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20       pTo->rCost 
348b0 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  = rCost;.       
348c0 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 20   pTo->rUnsorted 
348d0 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20  = rUnsorted;.   
348e0 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
348f0 72 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64 3b  red = isOrdered;
34900 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
34910 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f  pTo->aLoop, pFro
34920 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66  m->aLoop, sizeof
34930 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f  (WhereLoop*)*iLo
34940 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  op);.        pTo
34950 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d  ->aLoop[iLoop] =
34960 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20   pWLoop;.       
34970 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69   if( nTo>=mxChoi
34980 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
34990 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mxI = 0;.       
349a0 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b     mxCost = aTo[
349b0 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20  0].rCost;.      
349c0 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d      mxUnsorted =
349d0 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20   aTo[0].nRow;.  
349e0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31          for(jj=1
349f0 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a  , pTo=&aTo[1]; j
34a00 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b  j<mxChoice; jj++
34a10 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
34a20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72        if( pTo->r
34a30 43 6f 73 74 3e 6d 78 43 6f 73 74 20 0a 20 20 20  Cost>mxCost .   
34a40 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54            || (pT
34a50 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74  o->rCost==mxCost
34a60 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74   && pTo->rUnsort
34a70 65 64 3e 6d 78 55 6e 73 6f 72 74 65 64 29 20 0a  ed>mxUnsorted) .
34a80 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
34a90 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 43               mxC
34aa0 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74  ost = pTo->rCost
34ab0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
34ac0 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 70 54 6f  mxUnsorted = pTo
34ad0 2d 3e 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20  ->rUnsorted;.   
34ae0 20 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d             mxI =
34af0 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20   jj;.           
34b00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
34b10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34b20 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57  .    }..#ifdef W
34b30 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
34b40 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20  D  /* >=2 */.   
34b50 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
34b60 65 54 72 61 63 65 20 26 20 30 78 30 32 20 29 7b  eTrace & 0x02 ){
34b70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
34b80 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20  bugPrintf("---- 
34b90 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d  after round %d -
34ba0 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a  ---\n", iLoop);.
34bb0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20        for(ii=0, 
34bc0 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b  pTo=aTo; ii<nTo;
34bd0 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   ii++, pTo++){. 
34be0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
34bf0 62 75 67 50 72 69 6e 74 66 28 22 20 25 73 20 63  bugPrintf(" %s c
34c00 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d  ost=%-3d nrow=%-
34c10 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
34c20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
34c30 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
34c40 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
34c50 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a  ost, pTo->nRow,.
34c60 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
34c70 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 28  isOrdered>=0 ? (
34c80 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27  pTo->isOrdered+'
34c90 30 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  0') : '?');.    
34ca0 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f      if( pTo->isO
34cb0 72 64 65 72 65 64 3e 30 20 29 7b 0a 20 20 20 20  rdered>0 ){.    
34cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
34cd0 75 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30  ugPrintf(" rev=0
34ce0 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72  x%llx\n", pTo->r
34cf0 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  evLoop);.       
34d00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
34d10 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
34d20 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
34d30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
34d40 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
34d50 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65  /* Swap the role
34d60 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61  s of aFrom and a
34d70 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  To for the next 
34d80 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
34d90 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20    pFrom = aTo;. 
34da0 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a     aTo = aFrom;.
34db0 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f      aFrom = pFro
34dc0 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e  m;.    nFrom = n
34dd0 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e  To;.  }..  if( n
34de0 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  From==0 ){.    s
34df0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
34e00 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79  Parse, "no query
34e10 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20   solution");.   
34e20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
34e30 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20  b, pSpace);.    
34e40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
34e50 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ROR;.  }.  .  /*
34e60 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74   Find the lowest
34e70 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72   cost path.  pFr
34e80 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20  om will be left 
34e90 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74  pointing to that
34ea0 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d   path */.  pFrom
34eb0 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28   = aFrom;.  for(
34ec0 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20  ii=1; ii<nFrom; 
34ed0 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
34ee0 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f  From->rCost>aFro
34ef0 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46  m[ii].rCost ) pF
34f00 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d  rom = &aFrom[ii]
34f10 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
34f20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
34f30 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f  nLoop );.  /* Lo
34f40 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  ad the lowest co
34f50 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49  st path into pWI
34f60 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f  nfo */.  for(iLo
34f70 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  op=0; iLoop<nLoo
34f80 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
34f90 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
34fa0 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20  vel = pWInfo->a 
34fb0 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65  + iLoop;.    pLe
34fc0 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57  vel->pWLoop = pW
34fd0 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c  Loop = pFrom->aL
34fe0 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20  oop[iLoop];.    
34ff0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20  pLevel->iFrom = 
35000 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20  pWLoop->iTab;.  
35010 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75    pLevel->iTabCu
35020 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  r = pWInfo->pTab
35030 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
35040 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a  iFrom].iCursor;.
35050 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66    }.  if( (pWInf
35060 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
35070 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
35080 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70  NCT)!=0.   && (p
35090 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
350a0 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
350b0 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70  CTBY)==0.   && p
350c0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
350d0 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
350e0 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77  _NOOP.   && nRow
350f0 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74  Est.  ){.    Bit
35100 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20  mask notUsed;.  
35110 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65    int rc = where
35120 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
35130 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49  erBy(pWInfo, pWI
35140 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c  nfo->pResultSet,
35150 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20   pFrom,.        
35160 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 44           WHERE_D
35170 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70  ISTINCTBY, nLoop
35180 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  -1, pFrom->aLoop
35190 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55  [nLoop-1], &notU
351a0 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sed);.    if( rc
351b0 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c  ==pWInfo->pResul
351c0 74 53 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  tSet->nExpr ){. 
351d0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
351e0 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
351f0 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b  ISTINCT_ORDERED;
35200 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
35210 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
35220 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49  y ){.    if( pWI
35230 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
35240 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
35250 42 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  BY ){.      if( 
35260 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64  pFrom->isOrdered
35270 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ==pWInfo->pOrder
35280 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
35290 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
352a0 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
352b0 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b  ISTINCT_ORDERED;
352c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
352d0 73 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  se{.      pWInfo
352e0 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d  ->nOBSat = pFrom
352f0 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20  ->isOrdered;.   
35300 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
35310 4f 42 53 61 74 3c 30 20 29 20 70 57 49 6e 66 6f  OBSat<0 ) pWInfo
35320 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20  ->nOBSat = 0;.  
35330 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d      pWInfo->revM
35340 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76  ask = pFrom->rev
35350 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Loop;.    }.    
35360 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
35370 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
35380 53 4f 52 54 42 59 47 52 4f 55 50 29 0a 20 20 20  SORTBYGROUP).   
35390 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e       && pWInfo->
353a0 6e 4f 42 53 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e  nOBSat==pWInfo->
353b0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 0a  pOrderBy->nExpr.
353c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 42 69 74      ){.      Bit
353d0 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30  mask revMask = 0
353e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64  ;.      int nOrd
353f0 65 72 20 3d 20 77 68 65 72 65 50 61 74 68 53 61  er = wherePathSa
35400 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70  tisfiesOrderBy(p
35410 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70  WInfo, pWInfo->p
35420 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20  OrderBy, .      
35430 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c      pFrom, 0, nL
35440 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c  oop-1, pFrom->aL
35450 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72  oop[nLoop-1], &r
35460 65 76 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a  evMask.      );.
35470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
35480 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20  Info->sorted==0 
35490 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72  );.      if( nOr
354a0 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72  der==pWInfo->pOr
354b0 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
354c0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
354d0 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  sorted = 1;.    
354e0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d      pWInfo->revM
354f0 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20  ask = revMask;. 
35500 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
35510 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  ...  pWInfo->nRo
35520 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52  wOut = pFrom->nR
35530 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  ow;..  /* Free t
35540 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20  emporary memory 
35550 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63 65  and return succe
35560 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  ss */.  sqlite3D
35570 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65  bFree(db, pSpace
35580 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
35590 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
355a0 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73 65  Most queries use
355b0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
355c0 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e  able (they are n
355d0 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61  ot joins) and ha
355e0 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20  ve.** simple == 
355f0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69  constraints agai
35600 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c  nst indexed fiel
35610 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ds.  This routin
35620 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  e attempts.** to
35630 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70   plan those simp
35640 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d  le cases using m
35650 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e  uch less ceremon
35660 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65  y than the.** ge
35670 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75  neral-purpose qu
35680 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64  ery planner, and
35690 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20 66   thereby yield f
356a0 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72  aster sqlite3_pr
356b0 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73  epare().** times
356c0 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
356d0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  case..**.** Retu
356e0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73  rn non-zero on s
356f0 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73 20  uccess, if this 
35700 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e  query can be han
35710 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20  dled by this.** 
35720 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20  no-frills query 
35730 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e  planner.  Return
35740 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71 75   zero if this qu
35750 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a  ery needs the .*
35760 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
35770 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  e query planner.
35780 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
35790 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68 65  hereShortCut(Whe
357a0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
357b0 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72  Builder){.  Wher
357c0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20  eInfo *pWInfo;. 
357d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
357e0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57  item *pItem;.  W
357f0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
35800 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
35810 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  erm;.  WhereLoop
35820 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69   *pLoop;.  int i
35830 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  Cur;.  int j;.  
35840 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
35850 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20  ndex *pIdx;.  . 
35860 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
35870 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66  er->pWInfo;.  if
35880 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
35890 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52  lags & WHERE_FOR
358a0 43 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75 72  CE_TABLE ) retur
358b0 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
358c0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
358d0 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49  >nSrc>=1 );.  pI
358e0 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
358f0 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61  abList->a;.  pTa
35900 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
35910 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
35920 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
35930 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  0;.  if( pItem->
35940 7a 49 6e 64 65 78 20 29 20 72 65 74 75 72 6e 20  zIndex ) return 
35950 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65  0;.  iCur = pIte
35960 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57  m->iCursor;.  pW
35970 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
35980 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69  ;.  pLoop = pBui
35990 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c  lder->pNew;.  pL
359a0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30  oop->wsFlags = 0
359b0 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70  ;.  pLoop->nSkip
359c0 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20   = 0;.  pTerm = 
359d0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
359e0 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51  ur, -1, 0, WO_EQ
359f0 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72  , 0);.  if( pTer
35a00 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  m ){.    pLoop->
35a10 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
35a20 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
35a30 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  IPK|WHERE_ONEROW
35a40 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54  ;.    pLoop->aLT
35a50 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
35a60 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72      pLoop->nLTer
35a70 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70  m = 1;.    pLoop
35a80 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
35a90 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  1;.    /* TUNING
35aa0 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f 77 69  : Cost of a rowi
35ab0 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a  d lookup is 10 *
35ac0 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75  /.    pLoop->rRu
35ad0 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d  n = 33;  /* 33==
35ae0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
35af0 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ) */.  }else{.  
35b00 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
35b10 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
35b20 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
35b30 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
35b40 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61  pLoop->aLTermSpa
35b50 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  ce==pLoop->aLTer
35b60 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  m );.      if( !
35b70 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
35b80 64 78 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 49  dx).       || pI
35b90 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
35ba0 65 21 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  e!=0 .       || 
35bb0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72  pIdx->nKeyCol>Ar
35bc0 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61  raySize(pLoop->a
35bd0 4c 54 65 72 6d 53 70 61 63 65 29 20 0a 20 20 20  LTermSpace) .   
35be0 20 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20     ) continue;. 
35bf0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
35c00 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  pIdx->nKeyCol; j
35c10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65  ++){.        pTe
35c20 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
35c30 43 2c 20 69 43 75 72 2c 20 70 49 64 78 2d 3e 61  C, iCur, pIdx->a
35c40 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20 57  iColumn[j], 0, W
35c50 4f 5f 45 51 2c 20 70 49 64 78 29 3b 0a 20 20 20  O_EQ, pIdx);.   
35c60 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
35c70 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
35c80 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
35c90 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [j] = pTerm;.   
35ca0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
35cb0 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  !=pIdx->nKeyCol 
35cc0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
35cd0 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
35ce0 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
35cf0 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c  EQ|WHERE_ONEROW|
35d00 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
35d10 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 69       if( pIdx->i
35d20 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70 49  sCovering || (pI
35d30 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e  tem->colUsed & ~
35d40 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70  columnsInIndex(p
35d50 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Idx))==0 ){.    
35d60 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
35d70 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f  gs |= WHERE_IDX_
35d80 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ONLY;.      }.  
35d90 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72      pLoop->nLTer
35da0 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f  m = j;.      pLo
35db0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
35dc0 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  = j;.      pLoop
35dd0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
35de0 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 2f   = pIdx;.      /
35df0 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
35e00 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  f a unique index
35e10 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f   lookup is 15 */
35e20 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52  .      pLoop->rR
35e30 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d  un = 39;  /* 39=
35e40 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
35e50 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  5) */.      brea
35e60 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
35e70 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
35e80 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  s ){.    pLoop->
35e90 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 31  nOut = (LogEst)1
35ea0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b  ;.    pWInfo->a[
35eb0 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f  0].pWLoop = pLoo
35ec0 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61  p;.    pLoop->ma
35ed0 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b  skSelf = getMask
35ee0 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
35ef0 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 70  et, iCur);.    p
35f00 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62  WInfo->a[0].iTab
35f10 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  Cur = iCur;.    
35f20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20  pWInfo->nRowOut 
35f30 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49  = 1;.    if( pWI
35f40 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  nfo->pOrderBy ) 
35f50 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
35f60 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
35f70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69  By->nExpr;.    i
35f80 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
35f90 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
35fa0 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
35fb0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
35fc0 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
35fd0 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
35fe0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
35ff0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c  ITE_DEBUG.    pL
36000 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a  oop->cId = '0';.
36010 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
36020 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
36030 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
36040 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e  nerate the begin
36050 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ning of the loop
36060 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20   used for WHERE 
36070 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
36080 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  g..** The return
36090 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e   value is a poin
360a0 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65  ter to an opaque
360b0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
360c0 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f  contains.** info
360d0 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74  rmation needed t
360e0 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
360f0 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68  loop.  Later, th
36100 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
36110 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f  e.** should invo
36120 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ke sqlite3WhereE
36130 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65  nd() with the re
36140 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
36150 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
36160 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c  n order to compl
36170 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ete the WHERE cl
36180 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
36190 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
361a0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20  or occurs, this 
361b0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
361c0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
361d0 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f  basic idea is to
361e0 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f   do a nested loo
361f0 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20  p, one loop for 
36200 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a  each table in.**
36210 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
36220 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28   of a select.  (
36230 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
36240 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  E statements are
36250 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20   the.** same as 
36260 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e  a SELECT with on
36270 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
36280 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
36290 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65  ause.)  For.** e
362a0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53  xample, if the S
362b0 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a  QL is this:.**.*
362c0 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  *       SELECT *
362d0 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33   FROM t1, t2, t3
362e0 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a   WHERE ...;.**.*
362f0 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20  * Then the code 
36300 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e  generated is con
36310 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74  ceptually like t
36320 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
36330 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
36340 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20   row1 in t1 do  
36350 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
36360 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
36370 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
36380 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d  in t2 do      |-
36390 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
363a0 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20  eBegin().**     
363b0 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
363c0 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a  3 in t3 do   /.*
363d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  *            ...
363e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64  .**          end
363f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36400 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
36410 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
36420 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
36430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d                |-
36440 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
36450 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65  eEnd().**      e
36460 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
36470 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a             /.**.
36480 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
36490 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74   loops might not
364a0 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68   be nested in th
364b0 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68  e order in which
364c0 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20   they.** appear 
364d0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
364e0 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e  se if a differen
364f0 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65  t order is bette
36500 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a  r able to make.*
36510 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  * use of indices
36520 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61  .  Note also tha
36530 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70  t when the IN op
36540 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69  erator appears i
36550 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
36560 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20  lause, it might 
36570 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69  result in additi
36580 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70  onal nested loop
36590 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e  s for.** scannin
365a0 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61  g through all va
365b0 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68  lues on the righ
365c0 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
365d0 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  he IN..**.** The
365e0 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72  re are Btree cur
365f0 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
36600 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e  with each table.
36610 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72    t1 uses cursor
36620 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c  .** number pTabL
36630 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
36640 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20  r.  t2 uses the 
36650 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d  cursor pTabList-
36660 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a  >a[1].iCursor..*
36670 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  * And so forth. 
36680 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
36690 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
366a0 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20  open those VDBE 
366b0 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73  cursors.** and s
366c0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
366d0 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
366e0 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  ode to close the
366f0 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  m..**.** The cod
36700 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68  e that sqlite3Wh
36710 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72  ereBegin() gener
36720 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20  ates leaves the 
36730 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a  cursors named.**
36740 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69   in pTabList poi
36750 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61  nting at their a
36760 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69  ppropriate entri
36770 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63  es.  The [...] c
36780 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f  ode.** can use O
36790 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f  P_Column and OP_
367a0 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e  Rowid opcodes on
367b0 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74   these cursors t
367c0 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74  o extract.** dat
367d0 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f  a from the vario
367e0 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65  us tables of the
367f0 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   loop..**.** If 
36800 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
36810 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66   is empty, the f
36820 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73  oreach loops mus
36830 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69  t each scan thei
36840 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c  r.** entire tabl
36850 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65  es.  Thus a thre
36860 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e  e-way join is an
36870 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f   O(N^3) operatio
36880 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68  n.  But if.** th
36890 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  e tables have in
368a0 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20  dices and there 
368b0 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  are terms in the
368c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
368d0 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  at.** refer to t
368e0 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20  hose indices, a 
368f0 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73  complete table s
36900 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64  can can be avoid
36910 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
36920 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68  de will run much
36930 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f   faster.  Most o
36940 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68  f the work of th
36950 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68  is routine is ch
36960 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65  ecking.** to see
36970 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
36980 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62  dices that can b
36990 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  e used to speed 
369a0 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  up the loop..**.
369b0 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  ** Terms of the 
369c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65  WHERE clause are
369d0 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69   also used to li
369e0 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61  mit which rows a
369f0 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20  ctually.** make 
36a00 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20  it to the "..." 
36a10 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
36a20 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65   the loop.  Afte
36a30 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22  r each "foreach"
36a40 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68  ,.** terms of th
36a50 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
36a60 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72  hat use only ter
36a70 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20  ms in that loop 
36a80 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f  and outer.** loo
36a90 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ps are evaluated
36aa0 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20   and if false a 
36ab0 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f  jump is made aro
36ac0 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  und all subseque
36ad0 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70  nt.** inner loop
36ae0 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65  s (or around the
36af0 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65   "..." if the te
36b00 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  st occurs within
36b10 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d   the inner-.** m
36b20 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20  ost loop).**.** 
36b30 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a  OUTER JOINS.**.*
36b40 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20  * An outer join 
36b50 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64  of tables t1 and
36b60 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c   t2 is conceptal
36b70 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c  ly coded as foll
36b80 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f  ows:.**.**    fo
36b90 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
36ba0 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67   do.**      flag
36bb0 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72   = 0.**      for
36bc0 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
36bd0 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61  do.**        sta
36be0 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rt:.**          
36bf0 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
36c00 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20  flag = 1.**     
36c10 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20   end.**      if 
36c20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  flag==0 then.** 
36c30 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20         move the 
36c40 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61  row2 cursor to a
36c50 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20   null row.**    
36c60 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a      goto start.*
36c70 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20  *      fi.**    
36c80 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20  end.**.** ORDER 
36c90 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53  BY CLAUSE PROCES
36ca0 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65  SING.**.** pOrde
36cb0 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  rBy is a pointer
36cc0 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
36cd0 20 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20   clause (or the 
36ce0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a  GROUP BY clause.
36cf0 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f  ** if the WHERE_
36d00 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20  GROUPBY flag is 
36d10 73 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67  set in wctrlFlag
36d20 73 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  s) of a SELECT s
36d30 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74  tatement.** if t
36d40 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66  here is one.  If
36d50 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
36d60 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ER BY clause or 
36d70 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
36d80 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  ** is called fro
36d90 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  m an UPDATE or D
36da0 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
36db0 20 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69   then pOrderBy i
36dc0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
36dd0 65 20 69 49 64 78 43 75 72 20 70 61 72 61 6d 65  e iIdxCur parame
36de0 74 65 72 20 69 73 20 74 68 65 20 63 75 72 73 6f  ter is the curso
36df0 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69  r number of an i
36e00 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48  ndex.  If .** WH
36e10 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
36e20 59 20 69 73 20 73 65 74 2c 20 69 49 64 78 43 75  Y is set, iIdxCu
36e30 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  r is the cursor 
36e40 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64  number of an ind
36e50 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72  ex.** to use for
36e60 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65   OR clause proce
36e70 73 73 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52  ssing.  The WHER
36e80 45 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  E clause should 
36e90 75 73 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63  use this.** spec
36ea0 69 66 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66  ific cursor.  If
36eb0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
36ec0 45 53 49 52 45 44 20 69 73 20 73 65 74 2c 20 74  ESIRED is set, t
36ed0 68 65 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a  hen iIdxCur is.*
36ee0 2a 20 74 68 65 20 66 69 72 73 74 20 63 75 72 73  * the first curs
36ef0 6f 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  or in an array o
36f00 66 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c  f cursors for al
36f10 6c 20 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78  l indices.  iIdx
36f20 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  Cur should.** be
36f30 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
36f40 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
36f50 20 63 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e   cursor dependin
36f60 67 20 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78  g on which index
36f70 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a   is.** used..*/.
36f80 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74  WhereInfo *sqlit
36f90 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20  e3WhereBegin(.  
36fa0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
36fb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
36fc0 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
36fd0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
36fe0 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  st,    /* FROM c
36ff0 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66  lause: A list of
37000 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62   all tables to b
37010 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45  e scanned */.  E
37020 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
37030 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
37040 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
37050 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
37060 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20  ,   /* An ORDER 
37070 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29  BY (or GROUP BY)
37080 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c   clause, or NULL
37090 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
370a0 70 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52  pResultSet, /* R
370b0 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
370c0 20 71 75 65 72 79 20 2a 2f 0a 20 20 75 31 36 20   query */.  u16 
370d0 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
370e0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
370f0 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65  WHERE_* flags de
37100 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
37110 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49  nt.h */.  int iI
37120 64 78 43 75 72 20 20 20 20 20 20 20 20 20 20 20  dxCur           
37130 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54  /* If WHERE_ONET
37140 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74  ABLE_ONLY is set
37150 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e  , index cursor n
37160 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  umber */.){.  in
37170 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20  t nByteWInfo;   
37180 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e           /* Num.
37190 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
371a0 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73   for WhereInfo s
371b0 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  truct */.  int n
371c0 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
371d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
371e0 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70  of elements in p
371f0 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65  TabList */.  Whe
37200 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
37210 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20          /* Will 
37220 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72  become the retur
37230 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
37240 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  function */.  Vd
37250 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
37260 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20  pVdbe;   /* The 
37270 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65  virtual database
37280 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74   engine */.  Bit
37290 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20  mask notReady;  
372a0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
372b0 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
372c0 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a  yet positioned *
372d0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
372e0 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f  lder sWLB;     /
372f0 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
37300 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65  builder */.  Whe
37310 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
37320 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65  Set;    /* The e
37330 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73  xpression mask s
37340 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  et */.  WhereLev
37350 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20  el *pLevel;     
37360 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c     /* A single l
37370 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e  evel in pWInfo->
37380 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  a[] */.  WhereLo
37390 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
373a0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
373b0 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65  o a single Where
373c0 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
373d0 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
373e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
373f0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
37400 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
37410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
37420 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
37430 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  on */.  int rc; 
37440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37450 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
37460 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69  e */...  /* Vari
37470 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  able initializat
37480 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  ion */.  db = pP
37490 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73  arse->db;.  mems
374a0 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a  et(&sWLB, 0, siz
374b0 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f  eof(sWLB));..  /
374c0 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50  * An ORDER/GROUP
374d0 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f   BY clause of mo
374e0 72 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73  re than 63 terms
374f0 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d   cannot be optim
37500 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61  ized */.  testca
37510 73 65 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  se( pOrderBy && 
37520 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
37530 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20  =BMS-1 );.  if( 
37540 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64  pOrderBy && pOrd
37550 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53  erBy->nExpr>=BMS
37560 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   ) pOrderBy = 0;
37570 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  .  sWLB.pOrderBy
37580 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20   = pOrderBy;..  
37590 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44  /* Disable the D
375a0 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61  ISTINCT optimiza
375b0 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44  tion if SQLITE_D
375c0 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65  istinctOpt is se
375d0 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74  t via.  ** sqlit
375e0 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c  e3_test_ctrl(SQL
375f0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
37600 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20  IMIZATIONS,...) 
37610 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
37620 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
37630 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63  , SQLITE_Distinc
37640 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74  tOpt) ){.    wct
37650 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  rlFlags &= ~WHER
37660 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b  E_WANT_DISTINCT;
37670 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  .  }..  /* The n
37680 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
37690 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
376a0 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
376b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
376c0 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69   ** bits in a Bi
376d0 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65  tmask .  */.  te
376e0 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74  stcase( pTabList
376f0 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20  ->nSrc==BMS );. 
37700 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
37710 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73  Src>BMS ){.    s
37720 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
37730 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20  Parse, "at most 
37740 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a  %d tables in a j
37750 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20  oin", BMS);.    
37760 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
37770 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
37780 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72  n normally gener
37790 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f  ates a nested lo
377a0 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  op for all table
377b0 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c  s in .  ** pTabL
377c0 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65  ist.  But if the
377d0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
377e0 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74  ONLY flag is set
377f0 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64  , then we should
37800 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72  .  ** only gener
37810 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
37820 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20   first table in 
37830 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73  pTabList and ass
37840 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e  ume that.  ** an
37850 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  y cursors associ
37860 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71  ated with subseq
37870 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20  uent tables are 
37880 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
37890 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d   */.  nTabList =
378a0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
378b0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
378c0 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69  LY) ? 1 : pTabLi
378d0 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20  st->nSrc;..  /* 
378e0 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
378f0 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72  tialize the Wher
37900 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
37910 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
37920 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e   the.  ** return
37930 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65   value. A single
37940 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75   allocation is u
37950 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
37960 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20   WhereInfo.  ** 
37970 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74  struct, the cont
37980 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66  ents of WhereInf
37990 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65  o.a[], the Where
379a0 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
379b0 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  .  ** and the Wh
379c0 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63  ereMaskSet struc
379d0 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72  ture. Since Wher
379e0 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73  eClause contains
379f0 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20   an 8-byte.  ** 
37a00 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d  field (type Bitm
37a10 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20  ask) it must be 
37a20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d  aligned on an 8-
37a30 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e  byte boundary on
37a40 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69  .  ** some archi
37a50 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20  tectures. Hence 
37a60 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c  the ROUND8() bel
37a70 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65  ow..  */.  nByte
37a80 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73  WInfo = ROUND8(s
37a90 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29  izeof(WhereInfo)
37aa0 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69  +(nTabList-1)*si
37ab0 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
37ac0 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  );.  pWInfo = sq
37ad0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
37ae0 6f 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f  o(db, nByteWInfo
37af0 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c   + sizeof(WhereL
37b00 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d  oop));.  if( db-
37b10 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
37b20 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
37b30 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
37b40 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a      pWInfo = 0;.
37b50 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
37b60 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ginError;.  }.  
37b70 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
37b80 50 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f  Pass[0] = pWInfo
37b90 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31  ->aiCurOnePass[1
37ba0 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f  ] = -1;.  pWInfo
37bb0 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c  ->nLevel = nTabL
37bc0 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  ist;.  pWInfo->p
37bd0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
37be0 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
37bf0 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
37c00 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
37c10 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
37c20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
37c30 65 74 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b  et = pResultSet;
37c40 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  .  pWInfo->iBrea
37c50 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  k = pWInfo->iCon
37c60 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
37c70 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
37c80 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  .  pWInfo->wctrl
37c90 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61  Flags = wctrlFla
37ca0 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61  gs;.  pWInfo->sa
37cb0 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  vedNQueryLoop = 
37cc0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
37cd0 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d  op;.  pMaskSet =
37ce0 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53   &pWInfo->sMaskS
37cf0 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66  et;.  sWLB.pWInf
37d00 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57  o = pWInfo;.  sW
37d10 4c 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f  LB.pWC = &pWInfo
37d20 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e  ->sWC;.  sWLB.pN
37d30 65 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a  ew = (WhereLoop*
37d40 29 28 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f  )(((char*)pWInfo
37d50 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20  )+nByteWInfo);. 
37d60 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
37d70 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57  YTE_ALIGNMENT(sW
37d80 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68  LB.pNew) );.  wh
37d90 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42  ereLoopInit(sWLB
37da0 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53  .pNew);.#ifdef S
37db0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57  QLITE_DEBUG.  sW
37dc0 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27  LB.pNew->cId = '
37dd0 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  *';.#endif..  /*
37de0 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45   Split the WHERE
37df0 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70   clause into sep
37e00 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73  arate subexpress
37e10 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a  ions where each.
37e20 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69    ** subexpressi
37e30 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
37e40 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  by an AND operat
37e50 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d  or..  */.  initM
37e60 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29  askSet(pMaskSet)
37e70 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49  ;.  whereClauseI
37e80 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  nit(&pWInfo->sWC
37e90 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68 65  , pWInfo);.  whe
37ea0 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d  reSplit(&pWInfo-
37eb0 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b  >sWC, pWhere, TK
37ec0 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a  _AND);.    .  /*
37ed0 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61   Special case: a
37ee0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
37ef0 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20  at is constant. 
37f00 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20   Evaluate the.  
37f10 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
37f20 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76  d either jump ov
37f30 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f  er all of the co
37f40 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e  de or fall thru.
37f50 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
37f60 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e  ; ii<sWLB.pWC->n
37f70 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Term; ii++){.   
37f80 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30   if( nTabList==0
37f90 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49   || sqlite3ExprI
37fa0 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
37fb0 28 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d  (sWLB.pWC->a[ii]
37fc0 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
37fd0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
37fe0 6c 73 65 28 70 50 61 72 73 65 2c 20 73 57 4c 42  lse(pParse, sWLB
37ff0 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  .pWC->a[ii].pExp
38000 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  r, pWInfo->iBrea
38010 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k,.             
38020 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
38030 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
38040 20 20 20 20 20 20 73 57 4c 42 2e 70 57 43 2d 3e        sWLB.pWC->
38050 61 5b 69 69 5d 2e 77 74 46 6c 61 67 73 20 7c 3d  a[ii].wtFlags |=
38060 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
38070 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65   }.  }..  /* Spe
38080 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52  cial case: No FR
38090 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  OM clause.  */. 
380a0 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30   if( nTabList==0
380b0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64   ){.    if( pOrd
380c0 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e  erBy ) pWInfo->n
380d0 4f 42 53 61 74 20 3d 20 70 4f 72 64 65 72 42 79  OBSat = pOrderBy
380e0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->nExpr;.    if(
380f0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
38100 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
38110 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  T ){.      pWInf
38120 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
38130 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
38140 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  IQUE;.    }.  }.
38150 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62  .  /* Assign a b
38160 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d  it from the bitm
38170 61 73